在已编译的库中查找System.gc()

时间:2011-06-01 07:43:32

标签: java garbage-collection

我在gc-log中看到了显式的gc调用(见下文)。我可以删除-XX:+ DisableExplicitGC的调用,但我真的想知道哪个代码/库正在调用System.gc()

有关如何追踪它的任何提示?

2011-05-30T12:21:48.230+0200: 1.672: [Full GC (System) 1.672: [CMS: 0K->2227K(2868864K), 0.0862299 secs] 62069K->2227K(3118080K), [CMS Perm : 12899K->12893K(409600K)], 0.0863197 secs] [Times: user=0.06 sys=0.03, real=0.09 secs] 

3 个答案:

答案 0 :(得分:2)

我会使用FindBugs。它是一个神话般的工具,它有一个显式垃圾COllection调用的内置规则。

答案 1 :(得分:2)

我创建了一个System类的自定义版本,只要调用System.gc(),它就会向文件写入堆栈跟踪。这将允许您跟踪它所调用的所有位置。

这将在系统中的任何地方找到呼叫,包括JDK。

您调用System.gc()的一个地方是在RMI模块中,以帮助查找丢弃的远程对象。您可以减少使用

调用完整GC的频率
-Dsun.rmi.dgc.server.gcInterval=86400000
-Dsun.rmi.dgc.client.gcInterval=86400000

答案 2 :(得分:0)

使用分析器。任何现代的探查器都可以帮助你找到它。