我们正在开发一个仍处于非生产状态的新应用程序。我们正在使用 java 8。我们面临的问题是非堆逐渐增加,几天后它会导致 linux 系统崩溃。
我们的应用程序在 tomcat 上运行,我们使用自动部署方法。作为故障排除的一部分,我们进行了以下测试。
XMX = 4GB
重新启动 Tomcat 以重新开始。应用程序以以下统计信息开始
- 堆使用量 = 1.5gb
- 非堆 = 200mb
在 tomcat 重启后没有任何用户测试,我们进行了自动部署,同样的代码再次部署,发现非堆增加了一倍。
- 堆使用量 = 1.5gb
- 非堆 = 400mb
我们多次重复部署,每次,非堆都会增加。不仅仅是部署,而且只是启动/停止应用程序(不是 tomcat)也会将非堆增加 200mb。
基本上,我们将问题范围缩小到,当我们进行部署时,非堆会增加。需要注意的重要一点是我们不会在自动部署期间重新启动 tomcat。我正在寻找关于我是否应该在每次部署后包含 tomcat 重启步骤的建议?或者我应该包含 XX:MaxMetaspaceSize 参数以将阈值设置为非堆?
我们一直在监控我们的常规堆使用情况,没有任何问题。垃圾收集定期发生并回收空间。但是对于 NON-HEAP,情况并非如此,即使发生 GC,也不会从 NON-heap 回收空间。