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


只要RES列的值不大于我们给JVM设置Xmx的值,就没有关系 。Xmx这个参数的意思就是告诉操作系统,JVM本大爷我有可能要使用Xmx这么大的内存,你操作系统提前做好心理准备 。JVM进程刚运行的时候并不会直接找操作系统要Xmx这么大的内存,JVM在运行的过程中根据自己的情况一点一点问操作系统申请的 。一旦JVM进程从操作系统申请到内存之后,JVM在运行的过程中就可能就不会还给操作系统了 。因为JVM跟操作系统之间如果总是借呀还呀的就会很浪费性能,没有什么必要 。JVM进程退出之后占用的这些内存肯定会释放给操作系统的 。关于JVM是否把空闲的堆(heap)内存还给操作系统这件事,JVM提供了一些参数:
-XX:MinHeapFreeRatio、
-XX:MaxHeapFreeRatio、
-XX:-ShrinkHeapInSteps
这几个参数你们自己查资料吧 。
怎么验证这个说法?先找一个运行了1天以上的JVM进程,然后使用top命令看下这个JVM进程的RES列的值,然后再用我后面介绍的jmap -heap 19463 命令看一下JVM进程堆的使用情况就知道了 。
这块知识点摘自掘金APP上面 空无 大神的文章《 运维:你们 JAVA 服务内存占用太高 , 还只增不减!告警了 , 快来接锅 》 。
熊峰 大神的文章《 JVM调优之探索CMS和G1的物理内存归还机制 》 。
stackoverflow 网站的提问《 Does GC release back memory to OS? 》 。
Oracle官方文档《 Default Option Values for Heap Size 》 。
3 JAVA自带命令–jstat,查看GC(垃圾回收情况)jstat这个命令在JDK的安装目录bin/下面

JAVA应用生产问题排查步骤

文章插图
 
3.1 使用 jstat 查看 GC(垃圾回收) 的情况jstat -gc jvm进程PID 2000
这个命令会每隔2秒统计一下JVM进程(PID):19463的垃圾收集情况 , 命令最后2000的意思就是每隔2秒统计一次 。使用jstat命令可以实时监测到YGC和FGC的情况 , 包括每次YGC和FGC各花费了多长时间,到目前为止总共进行了多少次YGC和FGC 。
JAVA应用生产问题排查步骤

文章插图
 
jstat -gcutil jvm进程PID 2000
这个命令里面的-gcutil 监视内容与-gc基本相同 , 但输出主要关注已使用空间占总空间的百分比。
JAVA应用生产问题排查步骤

文章插图
 
也可以写成 jstat -gcutil jvm进程PID 2s  ,  2s也是2秒钟刷新一次的意思 。还有一种写法是 jstat -gcutil 19463 2s 5  , 这个命令是2秒钟刷新一次,总共统计5次就行了 , 5次之后自动结束jstat命令 , 不需要你手工按crtl+c去终止命令 。
JAVA应用生产问题排查步骤

文章插图
 
–gcutil监视内容 与 -gc基本相同 , 但输出主要关注已使用空间占总空间的 百分比  。
jstat -gccause 28549 2000
gccause 与-gcutil功能一样 , 但是会额外输出导致上一次GC产生的原因
JAVA应用生产问题排查步骤

文章插图
 
工作中我个人使用jstat -gccause和jstat -gc这个俩个命令比较多 。
3.2 jstat输出内容解释
  • jstat -gc jvm进程PID 2000

JAVA应用生产问题排查步骤

文章插图
 
jvm的堆(heap)空间由S0(Survivor,0号幸存区)+S1(Survivor,1号幸存区)+Eden(年轻代)+Tenured(Old老年代)+Permanent(永久代)组成的 。
注意:Permanent(永久代)在jdk1.7还是jdk1.8的时候被移除了,换成Metaspace(元数据)了 。注意,永久代的意思并不是这块内存永远不会回收,在发生FullGC的时候,永久代里面的垃圾也会被回收掉 。
所以jstat的输出结果说明为:
S0C(Capacity):S0的最大内存,总内存 。Capacity就是容量的意思 。单位:kb
S0U(Used):S0目前已经使用的大小 。Used就是已经使用的意思 。单位:kb
EC,EU:就是年轻代
PC,PU:就是永久代
OC,OU:就是老年代
YGC:就是年轻代的GC次数
YGCT:就是年轻代GC所花费的时间,单位秒
FGC:就是FGC的次数
FGCT:就是FGC所花费的时间,单位秒
GCT:就是YGC+FGC俩个GC加起来所花费的时间,单位秒
  • jstat -gcutil 4777 2000 5

JAVA应用生产问题排查步骤

文章插图
 
这个命令里面的-gcutil 监视内容与-gc基本相同 , 但输出主要关注已使用空间占总空间的百分比 , 所以-gcutil看到的是使用率 。


推荐阅读