繁体   English   中英

垃圾收集行为怪异

[英]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和内存使用情况

堆和伊甸园堆用法

老根堆用法

垃圾收集CPU时间

应用程序服务器本身是一个4核,16GB RAM。

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

CPU和内存使用情况

堆和伊甸园堆使用

老根堆用法

垃圾收集CPU时间

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM