Сборщик мусора

1

Каким образом ординарных поколения очищаются от сборщика мусора JVM? До тех пор, пока выделенный размер кучи не будет заполнен или?

Потому что для моего проекта у меня есть ThreadPoolExecutor, который выполняет большое количество задач. И поскольку эти runnable tasks создаются inner class, они имеют определенную ссылку на внешний экземпляр. Они легко выживут в GC в Eden Space и, наконец, Tenured Generation форму Survivor Space. И, контролируя JVM с помощью Java Profiler, я замечаю, что это Tenured Generation никогда не очищается (до полного, для моего случая).

Поэтому мои вопросы:

  1. Как Garbage Collector работает для кучи Tenured Generation?
  2. Если я хочу заставить GC памяти предотвратить непредсказуемые будущие проблемы с Heap, что я могу сделать?
  • 0
    Это довольно широкий вопрос, и ответ меняется в зависимости от того, какой алгоритм GC вы используете. Возможно, вы захотите поиграть с коллекционером G1, в нем вообще нет места для eden и inured.
  • 0
    Немного не по теме к вашему вопросу, но это может помочь цели вопроса. Можете ли вы разорвать ссылку из внутреннего класса, возможно, используя статический класс и передавая все необходимые данные своему конструктору?
Показать ещё 2 комментария
Теги:
garbage-collection
jvm

1 ответ

1
Лучший ответ

Как сборщик мусора работает для кучи накопленного поколения?

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

Если я хочу заставить GC памяти предотвратить непредсказуемые будущие проблемы с кучей, что я могу сделать?

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

  • 0
    Спасибо, безопасен ли вызов System.gc ()?
  • 0
    @ROROROOROROR Если под «безопасным» вы подразумеваете «не вывести систему из строя», я бы это предположил, если только у вас где-нибудь не получится несколько неудачных финализаторов и / или служебные данные GC не вызовут исключение / ошибку. Другими словами, да, вызов System.gc() в большинстве случаев безопасен. Обратите внимание, что это не обязательно рекомендуемая практика, согласно этому вопросу SO .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню