用jprofiler来分析 jvm 堆 内存泄露,fullgc

jvm 命令和工具_个人渣记录仅为自己搜索用的博客-CSDN博客

 堆太大?

  方法1: 重新设置堆后,重启,复现.

  方法2:  切割

split -b 1M heap.bin smallfile
scp smallfile* username@mac-host:/Users/username/
cat smallfile* > heap.bin

 官网文档

JProfiler Help - HPROF snapshots

heap walker教学:

用jprofile查看hprof文件_hprof jprofile_java老张的博客-CSDN博客

通识教学:

JVM监控及诊断工具GUI篇之JProfiler_每天都要进步一点点的博客-CSDN博客

问题: 接口调用超时逐步增加

分析 - > 发现进程 cpu占比很高 -> 进一步分析是垃圾回收线程一直在工作. 

-> 在看堆 ,堆占满了.

1. 降低jvm 参数,最大内存数, 复现

2. jmap dump

jmap -dump:live,format=b,file= 

3. 在JProfiler打开.

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第1张图片

4 找到最大size (retained size )的对象. 一层一层展开 有 %比

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第2张图片

 遇到"transitive reference" , 链接分析被中断了. 直接右键

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第3张图片

选择 "incoming references" 

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第4张图片

 直接定位到源头, dev环境的agent 泄露了.  本地环境上没有这个agent 看代码分析肯定也分析不出来.

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第5张图片

    问题 "transitive reference" 是什么, 如何展开?
在Java语言中,一个对象可能会引用其他对象,这些被引用的对象也可能会引用其他对象,这样就形成了一个对象的引用链。如果在这个引用链中,存在某个对象A被其他对象引用,并且对象A也直接或间接引用了其他对象,那么这些被间接引用的对象就称为对象A的传递引用(transitive reference)。

在JVM内存管理中,如果一个对象被其他对象引用,那么这个对象就不能被垃圾回收。如果这个对象又间接引用了其他对象,那么这些间接引用的对象也不能被垃圾回收。如果这种引用关系形成了一个传递引用链,那么整个链上的所有对象都不能被垃圾回收,即使它们已经变成了不可达对象。

5. 选择最大size的类 . 刚好对象有重复.

 用jprofiler来分析 jvm 堆 内存泄露,fullgc_第6张图片

在 JProfiler 中,"Use Selected Object"、"Use Selected java.lang.Class Object" 和 "Use Retained Objects" 是三个不同的选项,用于在内存分析时选择对象。

  1. "Use Selected Object" 选项允许你选择一个对象,然后查看该对象的引用关系、内存使用情况和方法调用链等信息。该选项适用于分析单个对象的内存使用情况。

  2. "Use Selected java.lang.Class Object" 选项允许你选择一个类对象,然后查看该类的内存使用情况、实例数量和方法调用链等信息。该选项适用于分析某个类的内存使用情况。

  3. "Use Retained Objects" 选项允许你选择一个对象,然后查看该对象及其引用的其他对象的内存使用情况。该选项适用于分析对象之间的引用关系和内存泄漏问题。

总的来说,这三个选项的区别在于它们选择的对象不同,从而适用于不同的内存分析场景。"Use Selected Object" 选项适用于分析单个对象的内存使用情况,"Use Selected java.lang.Class Object" 选项适用于分析某个类的内存使用情况,"Use Retained Objects" 选项适用于分析对象之间的引用关系和内存泄漏问题。

5.2 凑巧方法: 直接从String 类 着手,排序.

用jprofiler来分析 jvm 堆 内存泄露,fullgc_第7张图片

 附录

retained size等概念

shallow size

   Shallow size是指一个对象本身占用的内存大小,

retained size

   而retained size则是指一个对象及其引用对象占用的总内存大小。简单来说,shallow size是指对象自身占用的内存大小,而retained size则是指对象及其引用的其他对象占用的总内存大小。

deep size 

  deep size是指一个对象及其引用对象占用的总内存大小,但只计算直接引用的对象。例如,一个对象A直接引用B和C两个对象,B对象又引用D和E两个对象,那么A对象的deep size就是A、B和C这三个对象的总内存大小。

因此,Retained size和Deep size的区别在于计算引用对象的深度不同,Retained size会计算间接引用的对象,而Deep size只计算直接引用的对象。

问题: " Cannot View Allocations from Heapdump in JProfiler"


HPROF snapshots do not contain any information where objects were allocated. You have to use the JProfiler profiling agent and record allocation data before taking a heap snapshot in order to use this functionality.

问题 "transitive reference" 是什么, 如何展开?


在Java语言中,一个对象可能会引用其他对象,这些被引用的对象也可能会引用其他对象,这样就形成了一个对象的引用链。如果在这个引用链中,存在某个对象A被其他对象引用,并且对象A也直接或间接引用了其他对象,那么这些被间接引用的对象就称为对象A的传递引用(transitive reference)。

在JVM内存管理中,如果一个对象被其他对象引用,那么这个对象就不能被垃圾回收。如果这个对象又间接引用了其他对象,那么这些间接引用的对象也不能被垃圾回收。如果这种引用关系形成了一个传递引用链,那么整个链上的所有对象都不能被垃圾回收,即使它们已经变成了不可达对象。
 

你可能感兴趣的:(jvm)