【问题标题】:Quartz Scheduler throws java.lang.OutOfMemoryError: GC overhead limit exceededQuartz 调度程序抛出 java.lang.OutOfMemoryError: GC 开销限制超出
【发布时间】:2014-07-21 11:27:26
【问题描述】:

Quartz 调度器抛出 java.lang.OutOfMemoryError: GC overhead limit exceeded

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.mysql.jdbc.SingleByteCharsetConverter.toString(SingleByteCharsetConverter.java:327)
    at com.mysql.jdbc.ResultSetRow.getString(ResultSetRow.java:819)
    at com.mysql.jdbc.ByteArrayRow.getString(ByteArrayRow.java:70)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5816)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5733)

我们的应用程序有 1.5GB 的堆空间,但它仍然抛出它。我做了分析,在我们的代码中找不到任何泄漏。请帮我解决这个问题

【问题讨论】:

    标签: java memory-leaks garbage-collection quartz-scheduler


    【解决方案1】:

    这很可能是由您的应用程序中的内存泄漏引起的。请参阅this post 了解导致您的 GC 错误消息的详细信息。简而言之,您的应用程序的堆空间不足,而 GC 太努力地释放一些空间,直到它放弃,因为 JVM 花费了太多时间进行 GC 而不是做其他“有用”的事情。

    我建议您从正在运行的 JVM 生成堆转储,并使用可用的 JVM 堆分析工具之一对其进行分析(例如,Eclipse MAT 非常好)。您可以使用 jconsole 来监控您的 JVM 堆使用情况,并在 JVM 堆全部用完之前的某个时间点进行堆转储。

    【讨论】:

      【解决方案2】:

      当您的应用程序几乎耗尽所有可用内存并且 GC 多次无法清理它时,将显示“java.lang.OutOfMemoryError: GC overhead limit exceeded”错误。您可以尝试为进程提供更多内存。同样,这就像在启动脚本中添加(或增加)一个参数一样简单:

      java -Xmx1024m

      或者您可以继续免费试用Plumbr。当我们找到 java.lang.OutOfMemoryError 的原因后,您将看到问题的确切位置以及解决方案指南。

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 2020-09-08
        • 2020-07-24
        • 1970-01-01
        • 2019-06-29
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多