Метод для сбора мусора в Java - PullRequest
0 голосов
/ 13 декабря 2011

Есть ли какой-нибудь метод для сбора мусора с объекта?Как я знаю, finalize() вызывается как раз перед тем, как какой-либо объект собирается на сборку мусора.

Ответы [ 5 ]

6 голосов
/ 13 декабря 2011

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

Object o = new Object();
o = null; // at this point GC may remove the object.

Для форсирования процесса вы можете попытаться вызвать System.gc().Но помните, что это не гарантирует, что ваш объект будет действительно удален на этой итерации GC.

4 голосов
/ 13 декабря 2011

Есть ли какой-нибудь метод для сбора мусора объекта?

Нет, нет.

Объект будет (потенциально) собираться мусором после того, как станет "недоступным"».Может быть возможным запустить сборщик мусора в определенное время, вызвав System.gc().Тем не мение.JVM разрешено игнорировать ваш System.gc() вызов, а запуск GC в неподходящее время является пустой тратой ресурсов.

Действительно, вызов System.gc() для восстановления одного объекта ужасно неэффективен, и не обязательно будет восстанавливать его в любом случае ... даже если это мусор в этой точке.


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

3 голосов
/ 13 декабря 2011

Существует метод System.gc();, который просто дает подсказку сборщику мусора для объектов мусора.Но нет, метод, который вы вызываете, не существует, и объект сразу же удаляется.

2 голосов
/ 01 января 2012

Вы не должны полагаться на System.gc(); с изображениями.

В следующем примере будет получен мусор объекта.

bitmap.recycle(); 
bitmap = null;` 

Примечание: System.gc(); заметно замедляет работу приложения на некоторых устройствах.

1 голос
/ 13 декабря 2011

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

   /**
    * This method guarantees that garbage collection is
    * done unlike <code>{@link System#gc()}</code>
    */
   public static void gc() {
     Object obj = new Object();
     WeakReference ref = new WeakReference<Object>(obj);
     obj = null;
     while(ref.get() != null) {
       System.gc();
     }
   }

Вы можете использовать похожую технику, чтобы заменить obj ссылкой на объект, который вы хотите gc.

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

...