JAVA应用生产问题排查步骤( 四 )


这些命令你会使用了 , 关键结果你能看得懂吗?其实很简单 , 我们主要关注 , 年轻代和老年代和持久代的使用率 , 目前用了多少G , 最大的堆内存空间配置的是多少?是不是快满了 , 是不是快要内存溢出了就行 。GC前后的年轻代和老年代占用的空间是否减少了 , 如果发生了一次GC , 年轻代和老年代占用的空间并没有减少 , 那说明你的代码发生了内存泄漏 。要赶紧使用我下面介绍的jmap命令将java的堆现场的情况dump下来使用MAT软件或者GCeasy或者visualVM或者国内PerfMa社区的软件来分析dump内存文件 , 找到代码泄漏的真正原因 。Perfma社区的 阿飞Javaer 大神说FullGC一天超过一次肯定就不正常了 , 发现FullGC频繁的时候优先调查内存泄漏问题 。我认为这个说法不太对 , 我看了一下 , 我们生产环境的GC情况 , FullGC一天500次左右 , 服务也挺正常的 。并且老年代回收完使用率才13% , 说明我们生产环境FullGC是可以把垃圾回收掉的 。FullGC的次数本质是跟JVM的内存使用量有关系的,如果你们的系统业务很繁忙,FullGC次数多也是正常的 , 只有GC之后能把垃圾都回收掉就可以 。并且每次FullGC的STW线程停顿时间不长也没有关系的 。
4. JAVA自带命令–jinfo,查看JVM的配置信息jinfo这个命令在JDK的安装目录bin/下面

JAVA应用生产问题排查步骤

文章插图
 
jinfo -flags 12832
这个命令可以查看我们给JVM设置的配置项和参数(默认+人工配置)
JAVA应用生产问题排查步骤

文章插图
 
这个命令没啥说的 , 很简单就是看我们给JVM设置的一些参数信息 。
jinfo -flag MaxPermSize 1919,注意这个命令flag后面没有带s,这个命令用来看我们有没有给JVM设置MaxPermSize这个参数 。如果有 , 就将设置的值显示出来 。
JAVA应用生产问题排查步骤

文章插图
 
可以看到我 , 我给JVM设置的永久代MaxPermSize的最大空间为:-XX:MaxPermSize=1073741824(1个G)
jinfo -flag HeapDumpPath 111552
jinfo -flag MetaspaceSize 111552
jinfo -flag 这个命令不常用,最常用的就是 jinfo -flags 这个带s的直接看所有的JVM配置 。
使用jinfo命令可以看到我们指定的-Xmx 堆的最大值 。这里还有一个经验就是 , 最好将Xms(jvm堆heap的初始化大小) -Xmx(jvm堆heap的最大值),这个俩个的值设置为一样的 , 避免每次垃圾回收完成后JVM重新分配内存 , 可以防止在每次GC后进行内存重新分配,这块知识来自 Perfma社区的 阿飞Javaer
5. JAVA自带命令–jmap,查看heap(堆)的内存使用情况jmap这个命令在JDK的安装目录bin/下面
JAVA应用生产问题排查步骤

文章插图
 
jmap -heap 19463 查看java 堆(heap)使用情况注意看我的截图,一定要放大了截图 , 然后仔细看
JAVA应用生产问题排查步骤

文章插图
 
jmap -histo 19463 查看堆内存(histogram)中的对象数量及大小
JAVA应用生产问题排查步骤

文章插图
 
jmap -histo 19463 | head -n100 只显示前100行
JAVA应用生产问题排查步骤

文章插图
 
或者使用 jmap -histo:live 19463 | more 查看 , 使用more命令查看
JAVA应用生产问题排查步骤

文章插图
 
TIPS:more命令按空格可以翻页查看,按小写字母q可以退出more命令 。
jmap -histo:live 19463 这个命令会先触发JVM执行GC(垃圾回收) , 然后再统计信息 。为什么要先触发GC呢?因为这个命令live只统计活着的对象 。
jmap -dump:format=b,file=9739_jvm_heap.hprof 9739先解释一下什么叫做dump 。dump的意思是转存储,那什么叫做转存储呢?转存储就是将内存(运存)中的数据导出 , 然后保存(持久化)下来 。我们都知道APP(程序)在运行的时候也会产生一些临时数据或者APP(程序)在运行的时候也需要临时存储一些数据 。这些数据的存储都是临时性的 , 一旦APP(程序)运行结束 , 这些数据就都消失了 。所以当JVM运行的过程中出现问题的时候 , 注意是JVM在运行的时候出问题了 , 我们就需要把JVM运行时内存(heap堆)的情况dump(转存储) , 然后分析一下JVM的heap(堆)上面目前是什么情况?


推荐阅读