Как освободить память в Java

У меня есть этот фрагмент кода

A = new int[100];
B = new int[100];
C = boolean[100];

for(int i=1;i<=10000000;i++)
{
     A = new int[100];
     B = new int[100];
     C = boolean[100];

     // Do Something

     // Now i don't need A,B,C Array
}

Сколько раз я использую память для создания массива, могу ли я эффективно использовать память? Мне не нужны предыдущие массивы, мне нужен только текущий.

Я не хочу использовать дополнительную память для хранения предыдущих массивов? Эффективна ли моя память для кода?


person Narendra Modi    schedule 15.04.2017    source источник
comment
Я предполагаю, что этот код является частью метода? Если это так, A, B и C выйдут из области видимости, как только ваш код покинет метод. Затем об этом позаботится сборщик мусора, так что все в порядке. Конечно, вы всегда можете явно установить для них значение null.   -  person domsson    schedule 15.04.2017
comment
Взгляните на сборщик мусора Java, чтобы понять, как управляются объекты. Переменные примитивных типов просто удаляются, когда они выходят за пределы области видимости.   -  person Jean-Baptiste Yunès    schedule 15.04.2017
comment
Пожалуйста, соблюдайте соглашения об именах.   -  person Lew Bloch    schedule 15.04.2017


Ответы (1)


Как только A, B и C выходят за пределы области видимости, они подлежат сборке мусора. В вашем примере это означает конец оператора for.

Теперь, если на них не ссылаются какие-либо другие переменные, вы можете сделать их доступными для сборки мусора прямо сейчас после их использования и, не дожидаясь окончания оператора for, установив для них значение null ;

 A = new int[100];
 B = new int[100];
 C = boolean[100];

// processing where these are required
...
// processing where these are not required
 A = null;
 B = null;
 C = null;

Это не значит, что он освободит память прямо сейчас, но, по крайней мере, эти объекты будут считаться неиспользуемыми в следующей сборке GC.

ИЗМЕНИТЬ

В последних версиях JVM выполняется многократная оптимизация во время выполнения (JIT).
На веб-сайте Oracle можно найти некоторые пояснения по Точная компиляция и оптимизация.
Вы также можете найти на той же странице некоторые примеры оптимизации среды выполнения JRockit.

Таким образом, в соответствии с используемыми версиями JVM присвоение null может быть бесполезным, поскольку JVM может рассматривать объекты как выходящие за рамки, как только они больше не используются в своей области, то есть до конца оператора for.< бр>

Ответ Стивена на достаточно близкий вопрос предполагает это.
К сожалению, я не нашел никакой конкретной информации об этом конкретном оптимизация.

person davidxxx    schedule 15.04.2017
comment
Нет необходимости присваивать ссылкам значение null. Они будут удалены сборщиком мусора, когда они выйдут из области видимости и когда этого захочет сборщик мусора. Это непредсказуемо. - person fps; 15.04.2017
comment
@Federico Peralta Schaffner Конечно, но если конец области находится далеко в исполняемом коде, объекты останутся такими, на которые они ссылаются, и потенциально не будут собираться, пока они не требуются. Это вариант использования OP. - person davidxxx; 15.04.2017
comment
@Federico Peralta Schaffner Как только A, B и C выходят за рамки, они подлежат сборке мусора. В вашем примере это означает в конце оператора for. первое предложение моего ответа. - person davidxxx; 15.04.2017
comment
См. этот вопрос. - person fps; 15.04.2017
comment
@Federico Peralta Schaffner Спасибо за эту интересную ссылку. Похоже, что некоторые версии JVM могут считать объект недостижимым, как только он больше не используется. - person davidxxx; 15.04.2017
comment
Брайан Гетц, автор большей части API и признанный гуру Java, писал о тщетности и вреде попыток помочь сборщику мусора путем обнуления ссылок. Есть конкретные случаи, когда вам нужно, иначе это плохая идея. @davidxxx, если конец области достаточно далеко, чтобы негативно повлиять на сборщик мусора, это плохо написанный код. В любом случае, сборщик мусора не должен удалять объекты до тех пор, пока они не станут не нужны. Ключевым моментом является объявление ссылок в минимально необходимой области действия и управление временем жизни объекта. Обнуление ссылок — это лайфхак для ленивых программистов, которые ничего не продумывают. - person Lew Bloch; 15.04.2017
comment
@ Лью Блох, я полностью согласен с неприятным запахом. Здесь рефакторинг с извлеченным методом кажется лучше, чем хитрый код. - person davidxxx; 15.04.2017