【问题标题】:rate beetween gc heap allocation and my java program在 gc 堆分配和我的 java 程序之间进行评分
【发布时间】:2015-02-24 10:15:11
【问题描述】:

我的应用程序抛出 java.lang.OutOfMemoryError: GC overhead limit exceeded 错误。我搜索了它并获得了足够的信息。甲骨文说:

原因:详细信息“GC overhead limit exceeded”表示垃圾收集器一直在运行,Java 程序进展缓慢。垃圾回收后,如果 Java 进程花费超过大约 98% 的时间进行垃圾回收,并且如果它回收的堆少于 2%,并且到目前为止一直在做最后 5 个(编译时间常数)连续垃圾集合,然后抛出 java.lang.OutOfMemoryError。通常会抛出此异常,因为实时数据量几乎无法放入 Java 堆中,几乎没有用于新分配的可用空间。 行动:增加堆大小。超过 GC Overhead limit 的 java.lang.OutOfMemoryError 异常可以通过命令行标志 -XX:-UseGCOverheadLimit 关闭。

我的问题是;如何跟踪GC 和我的java 程序分配的堆。我试过jstat -gcutil 但它没有足够的信息。有没有一种工具可以让我看到我的 java 程序堆分配与GC 堆分配之间的比率? 感谢您的建议。

【问题讨论】:

  • jconsole 或商业分析器,例如jprofiler

标签: java memory garbage-collection


【解决方案1】:

请注意,这不是“java 堆”与“gc 堆分配”,而是专用于实际程序的 CPU 时间与专用于 GC 的 CPU 时间。当大部分时间都花在垃圾收集器中时,将引发异常。

当分配的堆接近其最大大小(选项-Xmx)并且堆中的大部分对象是reachable 时,就会发生这种情况。您的工作是确定最大大小是否太小(可能是您使用默认值),或者是否存在内存泄漏(阻止收集大树的对象)。

在处理这个问题时,我更喜欢使用 jvisualvm,它是 Oracle JDK 提供的,可以提供实时图形信息。

最新的 JVM 提供了比早期更详细的信息,但它们也使用了不同的 GC 算法,这可能会改变观察到的结果。

【讨论】:

  • 我应该为我的数据库操作使用结果集吗?我有 700 万条记录可供选择和插入。我已经使用了 8 个线程。
  • 当我使用 visualvm 进行跟踪时,堆大小分配从最大 486 mb 开始。我的程序仍在运行,堆大小现在约为 516 mb。它不会增加我的事情。它正在缩小。对此有何评论?会有帮助的
猜你喜欢
  • 2022-01-16
  • 2017-09-10
  • 2015-04-05
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2019-11-23
  • 2018-02-22
  • 1970-01-01
相关资源
最近更新 更多