垃圾收集行为怪异

Garbage collection acting weird

我刚接触一个项目,他们要求我调查服务器(应用程序)运行异常的原因。重新启动后,它们非常快(<150 毫秒响应时间),但是当它们 运行 大约 2 天后,它们会变慢。

内存和 CPU 上升,直到重新启动应用程序才会下降。

因此,他们正在 运行 设置一个 Tomcat (hybris) 服务器,该服务器具有以下命令行标志: -XX:ConcGCThreads=1 -XX:G1HeapRegionSize=4194304 -XX:GCLogFileSize=786432 -XX:InitialHeapSize=12884901888 -XX:+ManagementServer -XX:MaxGCPauseMillis=200 -XX:MaxHeapSize=12884901888 -XX:NewRatio=4 -XX: NumberOfGCLogFiles=10 -XX:-OmitStackTraceInFastThrow -XX:ParallelGCThreads=4 -XX:+ParallelRefProcEnabled -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:ReservedCodeCacheSize=134217728 -XX=ThreadStackSize 1024-XX:+UseCodeCacheFlushing-XX:+UseCompressedClassPointers-XX:+UseCompressedOops-XX:+UseG1GC-XX:+UseGCLogFileRotation-XX:+UseTLAB

下图可以看到重启前后的CPU和内存使用情况。应用服务器已经负载了几个小时了...

CPU & Memory usage

Heap & Eden Heap Usage

Old Gen Heap Usage

Garbage Collection CPU time

应用服务器本身是 4 核 16GB RAM。

2 次重新启动之间完整 运行 的屏幕截图:

您的应用程序存在内存泄漏。

这不是垃圾收集器 (GC) 问题,而是您的应用程序中的错误。这意味着某些对象已创建,但未被 GC 清除,因为指向它们的引用链接仍然存在于您的应用程序中。您应该调查哪些对象没有被清理并追踪它们是如何创建的以及引用留在了哪里。

正如您提到的 TomCat 我会首先检查 Servlet(或控制器和服务,如果您使用 Spring)是否有 class 属性 变量。