使用 jstat 摸清线上系统的JVM运行状况


prtyaa
prtyaa 2024-01-23 23:21:26 50461 赞同 0 反对 0
分类: 资源 标签: 后端
用一个工具来分析运行中的系统,他的对象增长的速率,Young GC的触发频率,Young GC的耗时,每次 Young GC后有多少对象是存活下来的,每次Young GC过后有多少对象进入了老年代,老年代对象增长的速率,Full GC的触发频率, Full GC的耗时。

1、功能强大的jstat

jstat可以检查JVM内的Eden、Survivor、老年代的内存使用情况,还有Young GC和Full gC的执行次数以及耗时。

2、jstat -gc PID

在生产机器linux上,找出Java进程的PID,用jps命令就可以看到。

接着 jstat -gc PID

3、其他的 jstat 命令

除了上面的jstat -gc命令是最常用的以外,他还有一些命令可以看到更多详细的信息

jstat -gccapacity PID:堆内存分析

jstat -gcnew PID:年轻代GC分析,这里的TT和MTT可以看到对象在年轻代存活的年龄和存活的最大年龄

jstat -gcnewcapacity PID:年轻代内存分析

jstat -gcold PID:老年代GC分析

jstat -gcoldcapacity PID:老年代内存分析

jstat -gcmetacapacity PID:元数据区内存分析

4、到底该如何使用jstat工具?

对jvm第一个要了解的事儿,就是随着系统运行,每秒钟会 在年轻代的Eden区分配多少对象。???

要分析这东西,你只要在线上linux机器上运行如下命令:jstat -gc PID 1000 10

这行命令意思就是每隔1秒钟更新出来最新的一行jstat统计信息,一共执行10次jstat统计

通过这个命令,可以非常灵活的对线上机器通过固定频率输出统计信息,观察每隔一段时间的jvm中的Eden区对象 占用变化。

举例:

执行命令之后,第一秒显示出来Eden区使用了200MB内存,第二秒显示出来的那行统计信息里,发现Eden区使用了205MB内存,第三秒发现Eden区使用了209MB内存,以此类推。

此时你可以轻易的推断出来,这个系统大概每秒钟会新增5MB左右的对象。

而且这里可以根据自己系统的情况灵活多变的使用,比如系统负载很低,不一定每秒都有请求,那么可以把上面的1秒调整为1分钟,甚至10分钟,去看系统每隔1分钟或者10分钟大概增长多少对象。

还有就是一般系统都有高峰和日常两种状态,比如系统高峰期用的人很多,此时你就应该在系统高峰期去用上述命令 看看高峰期的对象增长速率。然后你再得在非高峰的日常时间段内看看对象的增长速率。

按照上述思路,基本上你可以对线上系统的高峰和日常两个时间段内的对象增长速率有很清晰的了解。

5、Young GC的触发频率和每次耗时

其实多久触发一次Young GC就很容易推测出来了,因为系统高峰和日常时候的对象增长速率你都知道了,那么非常简 单就可以推测出来高峰期多久发生一次Young GC,日常期多久发生一次Young GC。

比如你Eden区有800MB内存,那么发现高峰期每秒新增5MB对象,大概高峰期就是3分钟会触发一次Young GC。日 常期每秒新增0.5MB对象,那么日常期大概需要半个小时才会触发一次Young GC。

那么每次Young GC的平均耗时呢?

简单,之前给大家说过,jstat会告诉你迄今为止系统已经发生了多少次Young GC以及这些Young GC的总耗时。

比如系统运行24小时后共发生了260次Young GC,总耗时为20s。那么平均下来每次Young GC大概就耗时几十毫秒 的时间。

你大概就知道每次Young GC的时候会导致系统停顿几十毫秒。

6、每次Young GC后有多少对象是存活和进入老年代

推测每次Young GC后有多少对象会存活下来,以及有多少对象会进入老年代。

比如3分钟会有一次Young GC

那么此时我们可以执行下述jstat命令:jstat -gc PID 180000 10。这就相当于是让他每隔三分钟执行一次统计,连续 执行10次。

此时看每隔三分钟之后发生了一次Young GC,此时Eden、Survivor、老年代的对象变化。

正常来说,Eden区肯定会在几乎放满之后重新变得里面对象很少,比如800MB的空间就使用了几十MB。Survivor区 肯定会放入一些存活对象,老年代可能会增长一些对象占用。所以这里的关键,就是观察老年代的对象增长速率。

从一个正常的角度来看,老年代的对象是不太可能不停的快速增长的,因为普通的系统其实没那么多长期存活的对 象。如果你发现比如每次Young GC过后,老年代对象都要增长几十MB,那很有可能就是你一次Young GC过后存活 对象太多了。

存活对象太多,可能导致放入Survivor区域之后触发了动态年龄判定规则进入老年代,也可能是Survivor区域放不下 了,所以大部分存活对象进入老年代。

最常见的就是这种情况。如果你的老年代每次在Young GC过后就新增几百KB,或者几MB的对象,这个还算情有可 缘,但是如果老年代对象快速增长,那一定是不正常的。

7、Full GC的触发时机和耗时

只要知道了老年代对象的增长速率,那么Full GC的触发时机就很清晰了,比如老年代总共有800MB的内存,每隔3分 钟新增50MB对象,那么大概每小时就会触发一次Full GC。

然后可以看到jstat打印出来的系统运行起劲为止的Full GC次数以及总耗时,比如一共执行了10次Full GC,共耗时 30s,每次Full GC大概就是需要耗费3s左右。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  125
统信桌面专业版【全盘安装UOS系统】介绍  120
银河麒麟桌面操作系统安装佳能打印机驱动方法  111
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!