垃圾收集行为怪异

时间:2018-01-29 10:36:55

标签: java performance memory garbage-collection hybris

我刚刚接触了一个项目,他们让我调查为什么服务器(应用程序)表现得很奇怪。重新启动后,它们非常快(响应时间小于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。

两次重启之间完整运行的屏幕截图:

CPU & Memory usage

Heap & Eden Heap usage

Old Gen Heap usage

Garbage Collection CPU time

1 个答案:

答案 0 :(得分:3)

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

这不是垃圾收集器(GC)问题,而是应用程序中的错误。这意味着创建了一些对象,但未使用GC进行清理,因为它们的引用链接仍然存在于您的应用程序中。您应该调查哪些对象未清理,并跟踪它们的创建方式以及引用的位置。

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