【发布时间】: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