Вы не указываете область действия myObj
и ее значение. Если это локальная переменная, это почти наверняка не имеет значения. Если это переменная экземпляра, то это может быть долговременная и ненужная ссылка, в этом случае будет полезно установить значение null
.
Обновление: , учитывая обновленную информацию о том, что myObj
является локальным для метода, будет иметь нулевое значение, чтобы установить его на null
в конце каждой итерации цикла. Рассмотрим этот пример:
public void process(String text) {
String[] lines = text.split("\n");
List<MyObject> list = new ArrayList<MyObject>();
Object myObj;
for (String line : lines) {
myObj = new MyObject(line);
list.add(myObj);
// 1. set myObj = null here
}
list = null; // 2
// 3. do some other stuff
}
public class MyObject {
private final String line;
public MyObject(String line) {
this.line = line;
}
}
Теперь в этом примере, скажем, на шаге 3 это заняло много времени. Скажи 10 минут. В течение этих 10 минут myObj
указывает на последнюю обработанную строку. Не похоже на проблему? Ну, это может быть. Подстроки работают в Java так, что они ссылаются на исходную строку. Так что если вы делаете:
String s = ... // 100 megabytes
String s2 = s.substring(100, 101);
вы на самом деле храните все 100 МБ в памяти, потому что s2 ссылается на s.
Так что в функции, которую я имею выше, myObj
ссылается на строку, которая ссылается на весь файл. Изменение шага 1 на myObj = null;
действительно поможет, потому что эта ссылка предотвращает сборку мусора для объекта.
Примечание: шаг 2 важен здесь, потому что если бы вы не аннулировали список, все ссылки в любом случае существовали бы.
Вам просто нужно подумать о том, как работают ссылки. Объект не будет собираться мусором, пока существует ссылка на него. Это означает очистку долгоживущих ссылок и поддержание переменных как можно более плотно ограниченных. Правильное решение для вышеизложенного:
for (String line : lines) {
Object myObj = new MyObject(line);
...
}
, а затем myObj
ограничивается внутри цикла, поэтому, как только цикл заканчивается или начинается другая итерация, он выходит из области видимости, что на намного лучше.