【问题标题】:Find System.gc() in compiled libraries在编译库中查找 System.gc()
【发布时间】:2011-06-01 07:43:32
【问题描述】:

我在我们的 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] 

【问题讨论】:

  • 我只是在调试器中启动应用程序,然后在 System.gc() (和 Runtime.gc() 确定)上放置一个方法断点。
  • 调试是一个非常好的和简单的建议。

标签: java garbage-collection


【解决方案1】:

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

这将在系统中的任何位置找到调用,包括 JDK。

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

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

【讨论】:

    【解决方案2】:

    我会使用FindBugs。这是一个很棒的工具,它有一个用于显式垃圾收集调用的内置规则。

    【讨论】:

      【解决方案3】:

      使用分析器。任何现代分析器都可以帮助您找到这一点。

      【讨论】:

        猜你喜欢
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        相关资源
        最近更新 更多