Маркировка объекта, подлежащего удалению в ГХ - PullRequest
10 голосов
/ 16 марта 2011

Есть ли где-нибудь, что я могу пометить объект в java для сбора мусора при следующей очистке?

Я слышал, что установка нулевого объекта больше не работает.

Ответы [ 4 ]

7 голосов
/ 16 марта 2011

Нет, вы не можете.Что бы вы ожидали, если бы другая переменная имела ссылку на нее?

Обратите внимание, что вы не можете установить объект в ноль - вы можете установить только переменную к нулю.Если другая переменная все еще имеет ссылку на объект, она все равно не будет подходить для сборки мусора.

Если вы считаете, что вам нужно это сделать, это, вероятно, означает, что вы неправильно интерпретируете свои данные - или что вы можетегде-то в вашем коде есть утечка (например, список, в который вы только добавляете записи, на которые ссылается статическая переменная - эти записи никогда не будут иметь права на сборку мусора, пока загрузчик классов жив).свой собственный GC, но в Hotspot объект будет собираться мусором в следующий раз, когда GC запускает поколение, в котором этот объект «живет» в настоящее время (при условии, что у него нет финализатора, что усложняет ситуацию).Если объект находится в «молодом» поколении, это, вероятно, произойдет довольно скоро - если он находится в «старом» поколении, это может занять больше времени.

Возможно, вы захотите посмотреть документацию по настройке Java 6 GC для получения дополнительной информации, хотя, конечно, с тех пор дела пошли дальше для OpenJDK 7 и т. Д.

4 голосов
/ 17 марта 2011

Я знаю, что на этот вопрос ответили, но есть способы, которыми вы можете манипулировать тем, как сборщик мусора Java смотрит на ваши ссылки. Вы можете сделать это через Мягкие ссылки, Слабые ссылки и Фантомные ссылки. Посмотрите на пакет java.lang.ref для лучшего объяснения.

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html

Также вот хороший пример, чтобы определить, когда PhantomReference собирается собирать мусор.

http://exampledepot.8waytrips.com/egs/java.lang.ref/PhantomRef.html

Вот основной сайт, с которого он пришел:

http://exampledepot.8waytrips.com/

2 голосов
/ 16 марта 2011

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

Дополнительно вы можете использовать

Runtime.getRuntime().gc();

что сборщик мусора должен бежать.Примечание: вы не можете быть уверены, что он действительно работает.

1 голос
/ 16 марта 2011

Вы слышали неправильно, но опять же описание тоже неверно.

Вы не устанавливаете объект в нуль, вы устанавливаете переменную в нуль. Если переменная может использоваться для доступа к объекту, тогда переменная имеет «ссылку» на объект. Установка переменной равной нулю аналогична переменной «потеря ссылки» на объект.

Как только Java обнаруживает, что запущенная программа не может достичь объекта или группы объектов, она удалит эти объекты из памяти. Он не удалит их из памяти на мгновение раньше, потому что если это произойдет, и какая-то другая часть программы попытается использовать ссылку на объект, то ссылка потерпит неудачу, что недопустимо в Java.

Хитрость заключается не в том, чтобы установить только одну ссылку на ноль, вы должны установить все ссылки, которые могли быть сделаны на нуль. Вот почему важно учитывать каждый раз, когда вы создаете новую ссылку, потому что вы хотите создать их таким образом, чтобы они в конечном итоге были очищены (если вы не хотите утечки памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...