java程序运行一段时间出现卡顿现象,相应的分析原因步骤如下:
1,nohup jstat -gcutil `pgrep java` 5s > gc1.log &
执行如上命令,命令解析:nohup 后台运行,jstat -gcutil 获取当前程序的gc情况统计 ,`pgrep java` 获取java进程id ,5s 打印gc情况5秒执行一次,>gc1.log & 把打印的gc情况输出到gc1.log文件中
当项目运行出现卡顿的时候运行上述命令
2,切换根目录 cd /
tail -f gc1.log 实时查询当前gc日志,如下图
简单介绍下上图中各列代表的含义
s0,s1:新生代内存占用百分比
e:新生代伊甸区内存占用百分比
o:老年代内存占用百分比
p:持久代占用内存百分比
YGC:YGC5秒执行的次数
YGCT:YGC5秒执行的时间
FGC:FGC5秒执行的次数
FGCT:FGC5秒执行的时间
GCT:总执行时间
上图中主要分析圈出的红框部分
当系统卡顿的时候o老年代内存使用占比已经达到百分之百,,,FGC执行频率过高,,,原因主要是当老年代内存使用达到85%时会触发一次FGC(应该是如此没有细查,不一定准确),,,,由上判断程序运行产生了大量gc无法回收的对象导致老年代内存使用增加达到一定阈值后FGC执行,FGC执行程序会暂停等待,所以FGC过多导致程序运行卡顿。
以上分析简单来说结论就是内存泄露导致的程序卡顿,
3,决定先调大jvm启动内存,暂时解决卡顿情况。另一方面在程序运行卡顿时导出堆快照,利用分析工具分析堆快照找出内存泄露的地方彻底解决问题。
(1),查询java现有运行内存 ps -ef | grep java 如下图
(2) free -m 查询linux当前使用内存情况
Mem行:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数
cached Page 缓存内存数
我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。
(-/+ buffers/cache):
(-buffers/cache) used内存数: (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free内存数: (指的第一部分Mem行中的free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.
(3)项目用的jboss 找到启动配置文件修改内存 启动配置文件目录/jboss/jboss-4.2.3.GA/bin 其中的run.conf为启动配置文件
(4)vim run.conf
改成红框中的
JAVA_OPTS="-Xms20000m -Xmx20000m -XX:MaxPermSize=512m -Xss2m -Xmn2048m -XX:SurvivorRatio=4 -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.rmi.server.hostname=10.5.85.5 -Dcom.sun.management.jmxremote.port=11099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true"
(5)重启项目,,查询是否更改成功 ps -ef | grep java
修改成功
4,导出堆快照
命令:jmap -dump:live,format=b,file=/path/heap.bin 进程ID
上述命令意思是:导出堆快照信息到path路径下的heap.bin文件中
5,堆快照信息导出后,下载到本地可用分析工具分析(几个分析工具jhat,MAT,VisualVM等)
jhat简:
此工具是java自带分析工具不需要把堆快照文件下载到本地,可以直接在linux上分析(但是会解析时会增加linux负担不建议使用)
简单用法:在linux上输入:jhat 堆快照文件 如:jhat heap.bin
分析好后会生成web服务,可以通过浏览器访问 http://linuxip:7000
具体分析此文不讲述,其他分析工具自行百度