【发布时间】:2018-01-29 10:36:55
【问题描述】:
我刚接触一个项目,他们要求我调查为什么服务器(应用程序)表现得很奇怪。重新启动后,它们的速度非常快(
内存和 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 和内存使用情况。应用服务器已经承受了几个小时的高负载...
应用服务器本身是一个 4 核的 16GB RAM。
两次重启之间完整运行的屏幕截图:
【问题讨论】:
-
您是否曾在代码中使对象无效?您是否只是继续创建对象而不删除旧对象? ...
-
不,我们不会继续创建对象。但是,我们确实在缓存中保留了很多产品和变体。
-
而且可能在内存压力的时候缓存没有释放对象。因此内存泄漏。 (这是一种可能性....)
-
根据图表,您有一个 ~12GB 的已提交堆,并且已使用的堆甚至没有触及 10GB 线,所以我没有看到任何与垃圾收集相关的问题。实际的问题应该是为什么系统在重负载时间开始交换,而当使用的物理内存仍然报告为 ~85% 时。但这不是 Java 问题……
标签: java performance memory garbage-collection hybris