GC图显示内存泄漏,但无法在转储中进行跟踪

问题描述 投票:0回答:1

我们的应用程序中有一个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日志中应该是平坦的,但是不会释放内存消耗,并且会不断增加。

堆转储:enter image description here

GC图:enter image description here

garbage-collection jvm heap-memory
1个回答
0
投票

我不确定您在上面使用的是哪个工具,但是我会在堆中寻找控制者层次。 Eclipse MAT是分析堆转储的好工具,它可以为您指明实际持有内存的方向,并且可以决定是否要将其归类为泄漏。不管贴上什么标签,如果应用程序由于内存不足而在一段时间后崩溃,那就是一个问题。

blog还讨论了诊断此类问题。

© www.soinside.com 2019 - 2024. All rights reserved.