我们的应用程序中有一个Java Micorservice,它已连接到Postgres和Phoenix。我们正在使用Spring Boot 2.x。
问题是,我们正在为我们的应用程序执行大约8个小时的耐久性测试,尽管我们对VM参数使用了建议的建议,但可以观察到使用的堆一直在增加,这看起来像是内存泄漏。我们分析了堆转储,但是根本原因对我们来说并不十分清楚,一些专家可以根据结果提供帮助吗?
我们实际使用的VM参数是:
-XX:ConcGCThreads = 8 -XX:+ DisableExplicitGC -XX:InitialHeapSize = 536870912 -XX:InitiatingHeapOccupancyPercent = 45 -XX:MaxGCPauseMillis = 1000 -XX:MaxHeapFreeRatio = 70 -XX:MaxHeapSize = 536870912 -XX:MinHeapFreeRatio = 40- XX:ParallelGCThreads = 16 -XX:+ PrintAdaptiveSizePolicy -XX:+ PrintGC -XX:+ PrintGCDateStamps -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:StringDeduplicationAgeThreshold = 1 -XX:+ UseCompressedClassPointers -XX:+ UseCompressedOops -XX:+ UseG1GC -XX:+ UseStringDeduplication
我们期望使用的堆在GC日志中应该是平坦的,但是不会释放内存消耗,并且会不断增加。
我不确定您在上面使用的是哪个工具,但是我会在堆中寻找控制者层次。 Eclipse MAT是分析堆转储的好工具,它可以为您指明实际持有内存的方向,并且可以决定是否要将其归类为泄漏。不管贴上什么标签,如果应用程序由于内存不足而在一段时间后崩溃,那就是一个问题。
此blog还讨论了诊断此类问题。