Найти System.gc() в скомпилированных библиотеках

#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:

Используйте профилировщики. Любой современный профилировщик поможет вам найти это.