在生产中设置-XX:+ DisableExplicitGC:可能出现什么问题?

Axe*_*xel 36 java tomcat garbage-collection

我们刚刚召开会议来解决用于计算保险费率的Web应用程序中的一些性能问题.计算在C/C++模块中实现,该模块也用于其他软件包.为了使其可用作Web服务,实现了一个Java包装器,它公开了一个基于XML的接口,并通过JNI调用C/C++模块.

测量表明,Java部分内的每次计算花费了几秒钟.所以我的第一次重新启动是在VM中启用垃圾收集日志记录.我们可以立刻看到许多世界上完整的GC已经完成.谈到这一点,java部分的开发人员告诉我们他们曾经System.gc()多次"确保在使用后释放内存".

好的,我不会再详细说明这个陈述...... ;-)

然后我们在上面添加-XX:+DisableExplicitGC了VMs参数并重新进行了测试.每次计算大约增加5秒.

由于我们无法System.gc()在发布过程中通过剥离所有这些调用来更改代码,因此我们正在考虑添加-XX:+DisableExplicitGC生产,直到可以创建新的Jar.

现在的问题是:这样做会有风险吗?关于我唯一能想到的是System.gc()重新部署时内部使用tomcat ,但这只是猜测.还有其他危险吗?

Eri*_* J. 32

您并不是唯一一个通过设置-XX:+DisableExplicitGC标志来修复世界末日GC事件的人.不幸的是(尽管文档中有免责声明),许多开发人员认为他们比JVM更清楚何时收集内存并准确介绍此类问题.

我知道很多情况下-XX:+DisableExplicitGC改善了生产环境,零实例存在任何负面影响.

安全的做法是在负载下运行当前的生产代码,并在压力测试环境中设置该标志并执行正常的QA循环.

如果你不能这样做,我会建议设置标志的风险小于在大多数情况下不设置标志的成本.

  • 关于这一点:“许多开发人员认为他们比 JVM 更了解”。实际上这是Java文档的问题。“System.gc”的描述没有表明它是一个危险的命令。我看过太多教程建议“定期”使用“System.gc”来释放内存。https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc() (2认同)