Маркировка объекта, который должен быть удален в GC

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

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

Ответ 1

Я знаю, что на этот вопрос был дан ответ, но есть способы, которыми вы можете манипулировать тем, как сборщик Java Garbage смотрит на ваши ссылки. Вы можете сделать это через Soft References, Weak References и Phantom Ссылки. Взгляните на пакет 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

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

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

Если вы считаете, что вам нужно это сделать, это, вероятно, означает, что вы неверно истолковываете свои данные - или что у вас может быть утечка где-то в вашем коде (например, список, который вы только когда-либо добавляете в записи, на который ссылается статическая переменная - эти записи никогда не будут иметь права на сбор мусора, пока классный загрузчик жив.)

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

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

Ответ 3

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

Кроме того, вы можете использовать

Runtime.getRuntime().gc();

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

Ответ 4

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

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

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

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