Почему это происходит при сборке мусора в java

Как я знаю, когда я запускаю сборку мусора с помощью метода System.gc(), он собирает все неиспользуемые и неуничтоженные объекты из кучи и очищает ее. Поэтому, когда я запускаю System.gc(); память JVM должна быть увеличена. но в приведенном ниже коде, когда я его запускаю, результат меня смущает.

Runtime rs = Runtime.getRuntime();
System.out.println("Free memory in JVM before Garbage Collection = " + 
                   rs.freeMemory());
rs.gc();
System.out.println("Free memory in JVM after Garbage Collection = " +
                   rs.freeMemory());

вывод

Free memory in JVM before Garbage Collection = 12184624
Free memory in JVM after Garbage Collection = 12184360    

см. значение до больше, чем значение после.

Пожалуйста, поправьте меня, если я ошибаюсь, или объясните мне, почему это происходит.

Спасибо.


person maXfenda    schedule 08.08.2013    source источник


Ответы (5)


Вызов сборки мусора в Java — это просто предложение для JVM. То, как собирается мусор, технически на 100% не под вашим контролем. Вызов System.gc() вежливо предлагает вынести мусор, но Java имеет право полностью игнорировать вас, как непослушного ребенка.

Хотя он ОБЫЧНО будет делать то, что вы просите, он будет делать это не всегда, и вы, конечно, не можете на него полагаться.

person Kon    schedule 08.08.2013
comment
Для справки: docs.oracle.com /javase/6/docs/api/java/lang/Runtime.html#gc() - person Daniel Williams; 08.08.2013
comment
Жаль, что System.gc() не возвращает логическое значение, поэтому вы можете привести дочерний элемент в форму, угрожая System.exit(), если он не выполняет свою работу. JVM иногда так пассивно-агрессивна со своими молчаливыми протестами. - person Jason C; 08.08.2013
comment
Некоторые виртуальные машины такие неряшливые, что у них даже нет корзины для мусора; они просто оставляют повсюду вонючие предметы, пока не умрут! - person chrylis -cautiouslyoptimistic-; 08.08.2013
comment
Для текущих реализаций сборщиков мусора я сомневаюсь, что вызов Runtime.gc() больше полезен. Я думаю, что этот призыв игнорируется большинством коллекционеров тока. - person Uwe Plonus; 08.08.2013

Сборка мусора выполняется автоматически по усмотрению системы в дополнение к любым запросам System.gc(). Нет никакой гарантии, что есть какая-либо память, которая может быть освобождена во время запроса.

person Patricia Shanahan    schedule 08.08.2013

Runtime.gc() является скорее подсказкой сборщику мусора приложить некоторые дополнительные усилия для освобождения памяти и может на самом деле не освобождать ее на практике, но ваше удивительное уменьшение значения свободной памяти вполне может быть связано с Runtime.freeMemory не дает точного результат;

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

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

person Joachim Isaksson    schedule 08.08.2013

Из Javadocs,

public void gc()

Запускает сборщик мусора. Вызов этого метода предполагает, что виртуальная машина Java затрачивает усилия на повторное использование неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, доступной для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина приложила все усилия для повторного использования всех отброшенных объектов. Имя gc расшифровывается как «сборщик мусора». Виртуальная машина выполняет этот процесс перезапуска автоматически по мере необходимости в отдельном потоке, даже если метод gc не вызывается явно.

Метод System.gc() является обычным и удобным средством вызова этого метода.

Говорит, что gc не будет очищаться, когда вы его вызываете, но добавляет его в очередь JVM, и JVM сделает это, если это необходимо, иначе игнорируется.

person Sri Harsha Chilakapati    schedule 08.08.2013

Вы, как Java-программист, не можете форсировать сборку мусора в Java. При вызове System.gc() он будет запускаться только в том случае, если JVM решит, что ему нужна сборка мусора на основе размера кучи Java. Существуют такие методы, как System.gc() и Runtime.gc(), которые используются для отправки запроса на сборку мусора в JVM и внутренне используют алгоритм пометки и очистки, чтобы определить, какие объекты больше не используются и должны быть собраны. как мусор, но не гарантируется, что сборка мусора произойдет именно в то время, когда вы вызываете System.gc() или Runtime.gc(). Кроме того, это также зависит от того, есть ли какие-либо объекты, подходящие для сборки мусора в то время, когда вы вызываете System.gc() или Runtime.gc(), если нет, то вызов System.gc() или Runtime.gc не будет иметь никакого эффекта. () в тот момент.

Источник: (Подробнее можно прочитать здесь)

http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

person Shailesh Saxena    schedule 08.08.2013