如何分析和定位Java堆外内存泄漏?
为了更细致地观察各代内存的使用情况,可以执行jstat -gccapacity pid命令。这个命令能清晰展示Young、Old和Perm(或Metaspace)三代对象的实际占用大小与最大容量。比如PGCMN和PGCMX分别代表Perm代的最小和最大内存使用量,通过对比当前占用PGC与最大值,可以判断是否接近溢出。
为了更细致地观察各代内存的使用情况,可以执行jstat -gccapacity pid命令。这个命令能清晰展示Young、Old和Perm(或Metaspace)三代对象的实际占用大小与最大容量。比如PGCMN和PGCMX分别代表Perm代的最小和最大内存使用量,通过对比当前占用PGC与最大值,可以判断是否接近溢出。
这个命令确实能看个大概,但说实话光靠 jstat 的容量数据,定位“泄漏”还是有点虚。因为容量满了可能是正常GC回收不掉,也可能是真泄漏。我觉得关键还得结合 jstat -gcutil 看回收效率,或者用 MAT/HeapAnalyzer 去 Dump 堆外内存看看对象引用链。不过提到 Perm/Metaspace 的对比确实是个很好的切入点,很多新手容易忽略元空间爆满导致的假性内存泄漏。