JVM原理、监控及瓶颈定位

一、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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值