您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~
工欲善其事,必先利其器。知道了GC工作原理,学会了看GC日志之后,再来了解一下分析GC的工具。它们分别是jstat、jmap、jhat。
jstat顾名思义,主要是用于查看JVM的内存和GC情况。先用jps找出Java进程的PID,再用jstat -gc [PID]查看JVM的内存和GC情况。例如:
结果说明:
1、S0C/S1C:From/To Servivor区的大小
2、S0U/S1U:From/To Servivor区当前使用的内存大小
3、EC/EU:Eden区大小及其当前使用的内存大小
4、OC/OU:老年代及其当前使用的内存大小
5、MC/MU:元空间及其当前使用的内存大小
6、CCSC/CCSU:类空间及其当前使用的内存大小
7、YGC:运行到目前为止Young GC的次数
8、YGCT:Young GC的耗时
9、FGC:运行到目前为止Full GC的次数
10、FGCT:Full GC的耗时
11、GCT:所有GC的总耗时
其他jstat命令:
1、jstat -gccapacity [PID]:堆内存分析
2、jstat -gcnew [PID]:年轻代GC,TT和MTT分别表示对象在年轻代存活的年龄和存活的最大年龄
3、jstat -gcnewcapacity [PID]:年轻代内存分析
4、jstat -gcold [PID]:老年代GC
5、jstat -gcoldcapacity [PID]:老年代内存分析
6、jstat -gcmetacapacity [PID]:元空间内存分析
拿jstat -gc [PID] [更新频率(毫秒)] [总更新次数]这个命令来说,它的命令实例是:jstat -gc 20553 1000 10,每秒更新,共10次
它常常用于:
1、查看年轻代对象增长速率
2、推算Young GC的触发频率和耗时
3、推算Young GC后多少对象存活
4、推算Young GC后有多少对象进入老年代
5、查看老年代对象的增长速率
6、推算Full GC的触发频率和耗时
有时可能需要知道到底是哪些对象占据了那么多内存,那么此时就可以使用jmap命令。jmap -heap [PID],打印结果可能像这样:
还可以使用jmap了解系统运行时的对象分布。例如:jmap -histo [PID],打印结果按照各种对象占用内存空间的大小降序排列,占用内存最多的在最上,可能会像这样:
比如,如果想生成一个堆内存快照并存放到指定文件中,那么可以这么用jmap:
jmap -dump:live,format=b,file=/home/work/dump.hprof [PID]
jhat用于分析生成的堆内存快照,它的输入其实就是jmap的输出:
jhat /home/work/dump.hprof
要想使用jhat,就要开启http服务和7000端口。在浏览器上输入这台机器的ip地址和端口号,就能看到对内存中的对象分布了。
分析JVM运行状况及优化包括两种:
1、预估性的优化,包括:
自行估算系统的运行压力,即:每秒多少请求、每个请求会创建多少对象、每个对象占用多少内存、机器该如何配置;尽量使得每次Young GC后的存活对象 < Survivor × 50%;尽量不进入老年代,减少Full GC频率;
2、压测系统时的JVM优化,包括新系统开发完成后,经过一系列的单元测试、集成测试、功能测试、压力测试,全部测试完成且通过后才能部署到正式环境;
一般需要模拟DAU为百万级的系统压力;使用Jmeter或者Apache A/B做压测;真正的优化,一定是结合实际业务之后的合理内存分布,没有什么固定的“模板”。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~