跟踪“超出 GC 开销限制”错误
Posted
技术标签:
【中文标题】跟踪“超出 GC 开销限制”错误【英文标题】:Tracking down a 'GC overhead limit exceeded' error 【发布时间】:2014-05-06 21:43:38 【问题描述】:(即找出原因)的最简单方法是什么?
我认为不是好的选择:
将-XX:-UseGCOverheadLimit
参数添加到JVM 调用。那个 Java 异常告诉我,我的实现中有一些非常低效的地方,我想解决这个问题。
“去仔细看看你的代码”。这个项目非常大,所以我需要一些关于哪里的线索来寻找效率低下的地方。
我应该使用分析器吗?如果是,你会推荐哪一个?
我应该查看 GC 日志吗?我试过这样做,但对它有一点了解,而且似乎没有明确的代码指针(说 哪些 对象正在被 GC'ed)。
在 SO 上已就此错误提出了许多问题,但似乎没有人回答这个具体问题。
【问题讨论】:
获取内存转储并使用Eclipse Memory Analyzer 对其进行分析。注意:产品来自Eclipse,并不意味着您需要使用/拥有Eclipse才能使用该产品。 分析器是您最大的希望。从 JVM 附带的 VisualVM 开始。我使用名为 YourKit 的商业分析器。 【参考方案1】:开始分析您的应用程序的最简单工具
Netbeans 带有一个内置的分析器。 Jconsole 也能帮上一点忙 VisualVm 也可以提供一点帮助。
非常棒的商业工具是 DyanTrace
现在介绍解决问题的方法: 虽然可以有其他方法可以解决它。但以下事情可能会有所帮助。 1)您看到的症状可能是在您的代码中创建了太多短期对象的结果。现在这不是内存泄漏情况,而是 JVM 清理的垃圾太多。而 Jvm 未能跟上这一点。您需要检查您的代码,了解这些对象是在哪里创建的。
2) 您可以做的第二件事是在两次 GC 运行之间定期进行几次堆转储,并在 netbeans 或您选择的其他工具中比较这些堆转储。您需要在您的应用程序进入这种不良状态之前执行此操作。此比较将告诉您堆中的增长情况,并且可能会为您提供查看代码的指针。
我希望这有助于解决您的问题。 :)
【讨论】:
你尝试了一些建议吗? 还没有,等我有时间试试看有没有用再告诉你。以上是关于跟踪“超出 GC 开销限制”错误的主要内容,如果未能解决你的问题,请参考以下文章
##[错误]错误:超出 GC 开销限制 - TFS 构建中的 SonarQube
布局 xml 上的 Java 堆空间错误:超出 GC 开销限制
在 Android Studio 中启用 R8 Shrinker 时超出 GC 开销限制
引起:java.lang.OutOfMemoryError:超出GC开销限制