分析: 内存飚⾼如果是发⽣在 java 进程上,⼀般是因为创建了⼤量对象所导致,持续飚⾼说明垃圾回收跟不上对象 创建的速度,或者内存泄露导致对象⽆法回收。
1、先观察垃圾回收的情况
jstat -gc PID 1000 查看 GC 次数,时间等信息,每隔⼀秒打印⼀次。
jmap -histo PID | head -20 查看堆内存占⽤空间最⼤的前 20 个对象类型 , 可初步查看是哪个对象占⽤了内
存。
如果每次 GC 次数频繁,⽽且每次回收的内存空间也正常,那说明是因为对象创建速度快导致内存⼀直占⽤很⾼;
如果每次回收的内存⾮常少,那么很可能是因为内存泄露导致内存⼀直⽆法被回收
。
2、导出堆内存⽂件快照
jmap -dump:live,format=b,file=/home/myheapdump.hprof PID dump 堆内存信息到⽂件。
3、使⽤visualVM对dump⽂件进⾏离线分析
找到占⽤内存⾼的对象,再找到创建该对象的业务代码位置,从代码 和业务场景中定位具体问题。