java程序运行卡顿定位分析,gc查看,堆快照导出

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

 

具体分析此文不讲述,其他分析工具自行百度