调整Java GC,以便它立即抛出OOME,而不是不确定地减速

jav*_*top 5 java performance garbage-collection jvm memory-management

我注意到,有时候,当内存几乎耗尽时,GC正试图以任何性能价格完成(导致程序几乎冻结,有时多分钟),而不是立即抛出OOME(OutOfMemoryError).

有没有办法在这方面调整GC?

将程序降低到接近零速度使其无响应.在某些情况下,最好是回答"我已经死了",而不是根本没有回应.

Cow*_*wan 8

像你所追求的东西被内置到最近的JVM中.

如果你:

  • 从(至少)Java 6使用Hotspot VM
  • 正在使用并行或并发垃圾收集器
  • UseGCOverheadLimit启用该选项(默认情况下,这些收集器已启用,因此更具体地说,如果您尚未禁用它)

然后你会在实际耗尽内存之前获得一个OOM:如果最近98%的时间用在GC中以恢复<2%的堆大小,那么你将得到一个抢先的OOM.

调整这些参数(特别是98%)听起来对你有用,但是据我所知,没有办法调整这些阈值.

但是,请检查您是否符合上述三点要求; 如果您没有使用带有该旗帜的收藏家,这可能有助于您的情况.

值得一读HotSpot JVM调优指南,这对这些东西有很大的帮助.


jav*_*top 0

事实证明,自Java8 b92以来就有一个解决方案:

-XX:+ExitOnOutOfMemoryError
启用此选项后,JVM 将在第一次出现内存不足错误时退出。如果您更喜欢重新启动 JVM 实例而不是处理内存不足错误,则可以使用它。

-XX:+CrashOnOutOfMemoryError
如果启用此选项,则当发生内存不足错误时,JVM 会崩溃并生成文本和二进制崩溃文件(如果启用了核心文件)。

一个好主意是将上述选项之一与旧的选项结合起来-XX:+HeapDumpOnOutOfMemoryError

我测试了这些选项,它们实际上按预期工作!

链接

查看功能描述

请参阅该 Java 版本中的更改列表