Когда System.gc () что-то делает? - PullRequest
108 голосов
/ 16 сентября 2008

Я знаю, что сборка мусора автоматизирована в Java. Но я понял, что если вы вызываете System.gc() в своем коде, JVM может или не может решить выполнить сборку мусора в этот момент. Как это работает точно? На каком основании / параметрах именно JVM решает сделать (или не делать) GC, когда видит System.gc()?

Есть ли примеры, в которых случае стоит добавить это в свой код?

Ответы [ 17 ]

2 голосов
/ 31 октября 2010

мы никогда не сможем форсировать сборку мусора. System.gc предлагает только vm для сборки мусора, однако, на самом деле, в какое время работает механизм, никто не знает, как указано в спецификациях JSR.

1 голос
/ 10 февраля 2009

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

Тем не менее, я думаю, что столкнулся со случаем, когда это может быть актуально. Я не уверен, хотя, поскольку мне еще предстоит проверить, имеет ли он какой-либо эффект:

Когда вы отображаете файл в память, я считаю, что вызов map () вызывает исключение IOException, когда достаточно большой блок памяти недоступен. Я думаю, что сбор мусора непосредственно перед файлом map () может помочь предотвратить это. Что ты думаешь?

1 голос
/ 25 июля 2012

Если вы хотите знать, вызван ли ваш System.gc(), вы можете с помощью нового обновления 7 Java 7 получать уведомление, когда JVM выполняет сборку мусора.

Я не уверен на 100%, что класс GarbageCollectorMXBean был представлен в обновлении 4 для Java 7, потому что я не смог найти его в примечаниях к выпуску, но нашел информацию в javaperformancetuning .com сайт

1 голос
/ 16 сентября 2008

Короче говоря:

Параметры зависят от виртуальной машины.

Пример использования - не могу придумать ни одного для приложений времени выполнения / производственных приложений, но полезно запустить его для некоторых профилирующих процессов, таких как вызов

// test run #1
test();
for (int i=0; i<10; i++) { 
// calling repeatedly to increase chances of a clean-up
  System.gc(); 
}
// test run #2
test();
1 голос
/ 16 сентября 2008

Я не могу вспомнить конкретный пример, когда хорошо запустить явный GC.

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

В качестве альтернативы, если вы просматриваете кучу с помощью анализатора кучи и подозреваете, что компонент библиотеки вызывает явные GC, вы можете отключить его, добавив: gc = -XX: + DisableExplicitGC к параметрам JVM.

0 голосов
/ 06 июля 2012

пока работает system.gc, он остановит мир: все ответы останавливаются, поэтому сборщик мусора может сканировать каждый объект, чтобы убедиться, что он удален. если приложение является веб-проектом, все запросы останавливаются до завершения gc, и это приведет к тому, что ваш веб-проект не сможет работать в моненте.

0 голосов
/ 21 сентября 2011

В соответствии с размышлениями в Java Брюса Эккеля, один из вариантов использования явного вызова System.gc () - это когда вы хотите принудительно завершить, то есть вызов finalize .

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