在gc堆分配和我的java程序之间的速率

时间:2015-02-24 10:15:11

标签: java memory garbage-collection

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

  

原因:详细消息“超出GC开销限制”表示垃圾收集器一直在运行,Java程序进展非常缓慢。在垃圾收集之后,如果Java进程花费超过大约98%的时间进行垃圾收集,并且它正在恢复少于2%的堆并且到目前为止已经执行了最后5个(编译时常量)连续垃圾集合,然后抛出java.lang.OutOfMemoryError。通常会抛出此异常,因为实时数据量几乎不适合Java堆,新分配的可用空间很小。       操作:增加堆大小。可以使用命令行标志-XX:-UseGCOverheadLimit关闭超出GC Overhead限制的java.lang.OutOfMemoryError异常。

我的问题是;如何跟踪GC和我的java程序分配的堆。我试过jstat -gcutil,但没有足够的信息。是否有一个工具,我可以看到我的Java程序堆分配超过GC堆分配? 谢谢你的建议。

1 个答案:

答案 0 :(得分:2)

请注意,它不是" java heap" vs" gc堆分配",但专用于实际程序的CPU时间与专用于GC的CPU时间相比。当大部分时间花在垃圾收集器上时抛出异常。

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

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

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

相关问题