0

我们正在开发一个仍处于非生产状态的新应用程序。我们正在使用 java 8。我们面临的问题是非堆逐渐增加,几天后它会导致 linux 系统崩溃。

我们的应用程序在 tomcat 上运行,我们使用自动部署方法。作为故障排除的一部分,我们进行了以下测试。

XMX = 4GB

  1. 重新启动 Tomcat 以重新开始。应用程序以以下统计信息开始

    • 堆使用量 = 1.5gb
    • 非堆 = 200mb
  2. 在 tomcat 重启后没有任何用户测试,我们进行了自动部署,同样的代码再次部署,发现非堆增加了一倍。

    • 堆使用量 = 1.5gb
    • 非堆 = 400mb

我们多次重复部署,每次,非堆都会增加。不仅仅是部署,而且只是启动/停止应用程序(不是 tomcat)也会将非堆增加 200mb。

基本上,我们将问题范围缩小到,当我们进行部署时,非堆会增加。需要注意的重要一点是我们不会在自动部署期间重新启动 tomcat。我正在寻找关于我是否应该在每次部署后包含 tomcat 重启步骤的建议?或者我应该包含 XX:MaxMetaspaceSize 参数以将阈值设置为非堆?

我们一直在监控我们的常规堆使用情况,没有任何问题。垃圾收集定期发生并回收空间。但是对于 NON-HEAP,情况并非如此,即使发生 GC,也不会从 NON-heap 回收空间。

4

2 回答 2

0

您应该检查类加载器的潜在问题,它加载了太多的类并且很可能导致此问题。

例如,您可以使用 Java Mission Control 等工具(只是一个示例)来关注下面突出显示的指标。

在此处输入图像描述

如果你看到之前的数字随着时间的推移而增加,你可以使用这个标志:

-verbose:class

使用先前的标志,您将获得有关可用于确定问题原因的类加载的信息。

于 2020-08-26T07:04:41.457 回答
0

我应该包含 XX:MaxMetaspaceSize 参数来为非堆设置阈值吗?

如果 Metaspace 正在增长,它迟早会达到最大大小阈值,并且您的 JVM 最终会因java.lang.OutOfMemoryError: Metaspace错误而崩溃。

我正在寻找关于我是否应该在每次部署后包含 tomcat 重启步骤的建议?

如果您负担得起,那么我建议您暂时将其包括在内,直到您解决问题为止。

另请按照此 SO 答案收集和诊断您的应用程序中的实际问题。谢谢!

于 2020-10-16T13:29:18.227 回答