一、jvm监控
监控命令 :jstat
列表模式 :jstat -gc pid 2000
百分比模式:jstat -gcutil pid 2000
总结:
认识:
A. 共10列,前4列是堆,第5列是栈,第6,7列分别是新生代gc次数及gc时间,第8,9列是老年代gc次数及gc时间,第10列是新生代及老年代gc的总时间
B. 新生代老年代每次gc时间=最新一次gc时间-上一次gc的时间
百分比模式:
列表模式:
C:内存量 U:使用量(单位:kb)
由监控到定位(C:内存量 U:使用量(单位:kb))
1.栈(P,第5列数据)
总结1:此列数据无限增大,说明并发量大,创建的对象引用多,当栈内空间使用率达到100%时,栈内存就无法存放对象引用,同时栈会出现栈内存溢出(增大栈内存)
总结2:栈内存能否进行gc:不能,一旦进行gc,对象引用就会被强制结束,即程序相应结束
总结3:第5列数据若无限增大则只能临时增加栈内存,根本解决还是需要解决代码瓶颈问题
2.堆(S0 S1 E O 前4列数据)
A.新生代(S0,S1,E前3列,YGC,YGCT 第6,7列)
总结1:eden列,S0,S1列达到内存上限时,进行YGC,这3列要腾出内存空间,即百分比要有所下降。反之则不正常
B.老年代(O,第4列,FGC,FGCT,第8,9列)
面试题:如何快速检测到jvm是否有瓶颈
1)手动减小jvm堆栈内存空间的配置,如-Xms=50M -Xmx=50M -Xmn=20M -XX:PermSize=20M –XX:MaxPermSize=20M
2)Jmeter进行接口压测
3)Jstat进行监控,依据总结进行监测是否有瓶颈。
二、监控有瓶颈,如何定位瓶颈
现象:
正常现象:各带百分比随YGC,FGC下降,整体呈锯齿曲线状
反常现象:各带百分比随YGC,FGC不下降,甚至还会上升
瓶颈定位思路:根据分析找到heap中持续引用的不被释放的对象,然后再找到问题的代码
瓶颈定位步骤:
Step1 对heap进行dump(压出瓶颈时再操作)(-F 强制)
jmap –dump:file=/root/pid.hprof,formate=b pid
step2 mat内存分析工具分析step1中得到的*.hprof文件
histogram→栈最大占用内存对象→右键查看对象进出调用关系→找到相关接口→找到对应代码运行具体问题具体分析
Heap快照分析:点击File-OpenFile-pid.hprof
加载完成-自动加载分析报告
查看柱状图,查看Shallow heap↓找到查看对多被引用的对象
查看相应的进出对象
找到对应自己压测的接口,正常情况下会被gc掉
对应找到相应代码,分析代码瓶颈,找到原因
help:
Shallow Heap Size
对象自身所占用的内存大小不包含其所引用的对象所占的内存大小
Retained Heap Size
前对象大小+当前对象可直接或间接引用到的对象的大小纵总和
如:A->B->C,C就是直接引用
原文:https://blog.csdn.net/zhangyi_1027/article/details/80903936