Недавно я узнал, что объекты могут быть помещены в стек или в кучу, а место их размещения определяется анализом побега. (Объявление нескольких массивов с 64 элементами в 1000 раз быстрее, чем объявление массива из 65 элементов)
В следующем примере я думаю, что объект «тест» помещается в кучу, что значительно увеличивает время выполнения:
public static void main(String args[]) {
double start = System.nanoTime();
long job = 100000000;// 100 million
int total = 0;
for (long i = 0; i < job; i++) {
int j = 0;
double[] test = new double[63];
test[0] =1;
total += test[0];
while (true) {
if (j == 0)
break;
j--;
}
test[0] = 10; // this makes a really big difference
}
double end = System.nanoTime();
System.out.println("Total runtime = " + (end - start) / 1000000 + " ms" + " total ="+ total);
}
Если либо цикл while удален, либо "test[0] = 10;" , проверка объекта помещается в стек (я понял это из-за того, что сборщик мусора в этом случае не вызывается, тогда как он вызывается, когда присутствуют оба. Также время выполнения составляет 350 мс вместо 6803 мс).
Мой вопрос: почему тест объекта помещается в кучу, если я изменяю/получаю доступ к содержимому объекта после цикла while?
test
— это Object.. Более того, когда вы видите ключевое словоnew
, это должно быть намеком на то, что задействована куча.. - person Maroun   schedule 15.09.2013