#java #garbage-collection
#java #сборка мусора
Вопрос:
Я вижу явные вызовы gc в нашем gc-log (см. Ниже). Я могу удалить вызовы с помощью -XX: DisableExplicitGC, но я действительно хочу знать, какой код / библиотека вызывает System.gc()
?
Есть какие-нибудь подсказки о том, как его отследить?
2011-05-30T12:21:48.230 0200: 1.672: [ Полная сборка (System) 1.672: [CMS: 0K-> 2227K (2868864K), 0,0862299 секунды] 62069K-> 2227K (3118080K), [CMS Perm: 12899K-> 12893 K (409600K)], 0,0863197 секунды] [Время: user = 0,06 sys = 0,03, real = 0,09 секунды]
Комментарии:
1. Я бы просто запустил приложение в отладчике и поставил точку останова метода
System.gc()
(иRuntime.gc()
просто для уверенности).2. Debug был действительно хорошим и простым предложением.
Ответ №1:
Я создал пользовательскую версию системного класса, который записывает в файл трассировку стека всякий раз, когда вызывается System.gc(). Это позволит вам отследить все места, где он вызывается.
Это позволит находить вызовы в любом месте системы, включая JDK.
Единственное место, где вы получаете вызовы System.gc(), находится в модуле RMI, чтобы помочь найти удаленные объекты, которые были удалены. Вы можете уменьшить частоту вызова полного GC с помощью
-Dsun.rmi.dgc.server.gcInterval=86400000
-Dsun.rmi.dgc.client.gcInterval=86400000
Ответ №2:
Я бы использовал FindBugs. Это потрясающий инструмент, и в нем есть встроенное правило для явных вызовов сборки мусора.
Ответ №3:
Используйте профилировщики. Любой современный профилировщик поможет вам найти это.