关闭
Hit
enter
to search or
ESC
to close
May I Suggest ?
#leanote #leanote blog #code #hello world
Okeeper's Blog
Home
Archives
Tags
DevOps
软件笔记
Spring
学习
JVM系列
关于我
记一笔JVM线上调优过程
无
545
0
0
zhangyue
最近一个测试环境的api-gateway一直报请求超时,并且未发现报错异常信息,于是开始排查是否是JVM参数不对导致用户线程挂起。 排查过程如下: 1. 查看目标机器的进程pid ``` [baibei@CBEC-UAT-1 uat]$ jps -l 27723 com.baibei.apigateway.Application ``` 2. 查看jvm内存使用情况 ``` [baibei@CBEC-UAT-1 uat]$ jstat -gc 27723 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 32256.0 32768.0 0.0 11081.0 109568.0 43766.1 349696.0 37358.1 50688.0 50345.7 11 4.384 0 0.000 4.384 ``` 发现PC(方法区的总大小)与PU(方法区使用大小)非常接近,查看使用的百分比 ``` [baibei@CBEC-UAT-1 uat]$ jstat -gcutil 27723 S0 S1 E O P YGC YGCT FGC FGCT GCT 25.40 0.00 98.13 9.73 99.32 10 4.351 0 0.000 4.351 ``` 发现方法区(永久区)使用率达99.32%,奇怪怎么使用了那么多,然后想起java命令启动时没有指定任何的jvm参数,PermSize默认是1/64物理内存,MaxPermSize默认是1/4物理内存,然而实际使用jinfo命令查看时,这两个值并没有那么多,如下: ``` [baibei@CBEC-UAT-1 uat]$ jinfo -flag PermSize 8481 -XX:PermSize=21757952 [baibei@CBEC-UAT-1 uat]$ jinfo -flag MaxPermSize 8481 -XX:MaxPermSize=85983232 ``` `-XX:PermSize`的默认值是21757952 byte=20.5M `-XX:MaxPermSize`的默认值为85983232 byte=82M(这里的默认单位是byte),具体为什么不是官方称的1/64和1/4物理内存,就请哪位高手告知。通过上面jstat -gc 名称可知实际使用是PU=50345.7kb,而方法区总容量也是在默认值不够时根据实际使用量调整到了50688.0kb,所以就是我们看到的方法区使用率在99%以上。 3. 手动设置`-XX:PermSize` 和 `-XX:MaxPermSize` 在启动脚本中添加这两个参数 ``` java -XX:PermSize=64M -XX:MaxPermSize=128M com.baibei.apigateway.Application ``` 添加后运行`jstat -gcutil` 和 `jstat -gc` ``` [baibei@CBEC-UAT-1 uat]$ jstat -gcutil 12189 S0 S1 E O P YGC YGCT FGC FGCT GCT 25.47 0.00 82.20 10.07 75.92 10 0.302 0 0.000 0.302 [baibei@CBEC-UAT-1 uat]$ jstat -gc 12189 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 31744.0 32768.0 8083.9 0.0 109568.0 90491.0 349696.0 35226.3 65536.0 49758.8 10 0.302 0 0.000 0.302 ``` 可以看到方法区的P使用率已经在75.92%了 4. 总结 - 可以通过 `jinfo -flag [FlagName] [pid]`查询jvm的启动参数实际使用数值,也可通过`java -XX:+PrintFlagsInitial |grep PermSize` 查看jvm各个参数的默认数值,这里的单位是byte. - `PermSize`是java进程启动时给方法区分配的初始大小,当初始大小不够用时触发一次FullGC,如果还不够用,按实际所需在给其分配相应大小,最终大小不得超过`MaxPermSize`,否则将报`java.lang.OutOfMemoryError: PermGen space`。
觉得不错,点个赞?
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
文章目录