Каким образом ординарных поколения очищаются от сборщика мусора JVM? До тех пор, пока выделенный размер кучи не будет заполнен или?
Потому что для моего проекта у меня есть ThreadPoolExecutor
, который выполняет большое количество задач. И поскольку эти runnable tasks
создаются inner class
, они имеют определенную ссылку на внешний экземпляр. Они легко выживут в GC
в Eden Space
и, наконец, Tenured Generation
форму Survivor Space
. И, контролируя JVM с помощью Java Profiler, я замечаю, что это Tenured Generation
никогда не очищается (до полного, для моего случая).
Поэтому мои вопросы:
Garbage Collector
работает для кучи Tenured Generation
?GC
памяти предотвратить непредсказуемые будущие проблемы с Heap
, что я могу сделать?Как сборщик мусора работает для кучи накопленного поколения?
Ну, это в значительной степени, как вы описали. Ничего не происходит, пока пространство не понадобится (или может понадобиться в ближайшее время), и в этот момент запускается основной GC. Я предполагаю, что это было предназначено для поведения - не хотите, чтобы приостановки пауз-пауза запускались чаще, чем нужно.
Если я хочу заставить GC памяти предотвратить непредсказуемые будущие проблемы с кучей, что я могу сделать?
Технически вы не можете. GC запускается всякий раз, когда захочет, независимо от намеков, которые вы ему даете. Если вы хотите предложить, чтобы среда выполнения выполняла GC, вы можете использовать System.gc()
, но опять же, это только предположение - среда выполнения может игнорировать ее, если захочет. Из того, что я слышал, вызов System.gc()
как правило, учитывается.
System.gc()
в большинстве случаев безопасен. Обратите внимание, что это не обязательно рекомендуемая практика, согласно этому вопросу SO .