2013-07-05 5 views
1

Я знаю, что все собирает мусор. Но что именно сообщает JRE, что настало время для сбора мусора? Это как какое-то событие или временной интервал?Какие триггеры сбора мусора

+1

Наверняка кто-то спросил об этом раньше ... да. – Ben

ответ

0

Вы можете использовать System.gc();, но нет гарантии, что он будет работать (он просто «предлагает» GC для запуска).

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

+0

Вы действительно не должны использовать System.gc. JVM лучше знает, когда делать GC, чем вы. Есть некоторые угловые случаи, когда это может быть оправдано вызовом System.gc, но большую часть времени разработчики не должны этого делать. – pushy

+0

@pushy полностью согласен с вами! – alfasin

0

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

0

я вещь, как хорошие практики DonT полностью зависят от GC, см мусора THIS ИЛИ THIS

5

HotSpot вырос в чрезвычайно сложное дело, что даже его создатели стремятся понять во всех деталях. Поэтому вам нельзя дать простой ответ; некоторые триггеры:

  1. занятие каждого поколения объектов, достигающее порога;
  2. запрос на распределение памяти в конкретном поколении отказ;
  3. общая занятость кучи, достигнув порога.

Обратите внимание, что вы даже не указано, что вид сбора мусора вы заинтересованы в: есть коллекция незначительные и набор а основных и технологически они очень разные. Вы также не указали, какой сборщик мусора вы имеете в виду: у HotSpot есть четыре из них на выбор.

Если вы новичок в Java, лучшим советом является а) в повседневном программировании, не беспокойтесь об этом; и b) если вы хотите учиться, вам нужно будет dig deep.

0

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

Но это поведение JVM не может быть гарантировано, можно запросить GC из программы java, но нет гарантии, что этот запрос будет рассмотрен JVM.

+1

Первая часть права, Java будет делать GC, когда память бежит низко. Но Java не знает, когда объект становится подходящим для GC (это решение принято в самой GC). Если используется маркер/стрелочный коллектор, он, конечно, будет отмечать мертвые объекты и при необходимости запускать их на них, но это часть GC. – pushy

+0

@pushy: вы правы, я неправильно понял * когда * объект, подходящий для GC, и когда JVM * работает * GC, спасибо за примечание. – Azad

0

Сбор мусора в java происходит, когда JVM считает, что сборку мусора необходимо на основе Java heap size.

Но вы можете заставить GC для сбора мусора с использованием

System.gc() 

или

Runtime.gc() 

Но это не гарантирует, что сборка мусора будет происходить.

Подробнее: http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2Y9gKzQE1

+3

Вы не «заставляете» сбор мусора. Как вы сами говорите: нет никакой гарантии. Я думаю, что ** просьба ** - лучшее слово здесь. –

Смежные вопросы