JVM系统优化实践(14):GC可视化工具

时间:2021-12-07 01:26:40

您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~



工欲善其事,必先利其器。知道了GC工作原理,学会了看GC日志之后,再来了解一下分析GC的工具。它们分别是jstat、jmap、jhat。

jstat顾名思义,主要是用于查看JVM的内存和GC情况。先用jps找出Java进程的PID,再用jstat -gc [PID]查看JVM的内存和GC情况。例如:

JVM系统优化实践(14):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],打印结果可能像这样:

JVM系统优化实践(14):GC可视化工具


还可以使用jmap了解系统运行时的对象分布。例如:jmap -histo [PID],打印结果按照各种对象占用内存空间的大小降序排列,占用内存最多的在最上,可能会像这样:

JVM系统优化实践(14):GC可视化工具


比如,如果想生成一个堆内存快照并存放到指定文件中,那么可以这么用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做压测;真正的优化,一定是结合实际业务之后的合理内存分布,没有什么固定的“模板”。



感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~