jvm内存分析相关资料 整理

前言:
给一个系统定位 问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
数据包括:运行的日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hpror文件)
–引用自 深入理解JAVA虚拟机 一书

常用的jdk自带的工具
注: pid: 为java程序运行的进行号

jps 虚拟机进程状况工具
英文命名JVM Process Status Tools, 显示指定系统内所有的HostSpot虚拟机进程的工具

jps 显示java程序进程号、名称
jps -l  输出运行进程的全类名
jps -v 输出运行进行的启动时的jvm配置参数

 

jstat 虚拟机统计信息监视工具
英文命名 JVM Statistics Monitoring Tool 用于收集HotSpot虚拟机各方面的运行数据

jstat [option vmid [interval]  [s|ms] [count] ]

option:
-class				显示ClassLoad的相关信息;
-compiler 			显示JIT编译的相关信息;
-gc 				显示和gc相关的堆信息;
-gccapacity   	    显示各个代的容量以及使用情况;
-gcmetacapacity 	显示metaspace的大小
-gcnew 				显示新生代信息;
-gcnewcapacity 		显示新生代大小和使用情况;
-gcold 				显示老年代和永久代的信息;
-gcoldcapacity 		显示老年代的大小;
-gcutil   			显示垃圾收集信息;
-gccause 			显示垃圾回收的相关信息(通-gcutil),
					同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation 	输出JIT编译的方法信息;

 

常用的一些组合如下:
监视java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量已用空间、GC时间合计等信息,以下这条的命令的意思是指定的jvm进程每250ms查询一次进程pid的垃圾收集情况,一共查询 20次

jstat -gc pid 250 20 

other:
jstat -gcutil pid 
jstat -gccause pid 100

 

这是一个真实线上的频繁FGC的切片截图
在这里插入图片描述
对比上图字段 解释

  S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
   EC:年轻代中Eden(伊甸园)的容量 (字节)
   EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
   OC:Old代的容量 (字节)
   OU:Old代目前已使用空间 (字节)
   MC:metaspace(元空间)的容量 (字节)
   MU:metaspace(元空间)目前已使用空间 (字节)
 CCSC:	当前压缩类空间大小
 CCSU:	压缩类空间使用大小
  YGC:从应用程序启动到采样时年轻代中gc次数
 YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  FGC:从应用程序启动到采样时old代(全gc)gc次数
 FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  GCT:从应用程序启动到采样时gc用的总时间(s)

 

others

  S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
   EC:年轻代中Eden(伊甸园)的容量 (字节)
   EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
   OC:Old代的容量 (字节)
   OU:Old代目前已使用空间 (字节)
   PC:Perm(持久代)的容量 (字节)
   PU:Perm(持久代)目前已使用空间 (字节)
  YGC:从应用程序启动到采样时年轻代中gc次数
 YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  FGC:从应用程序启动到采样时old代(全gc)gc次数
 FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
  NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节) 
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节) 
PGCMX:perm代的最大容量 (字节)   
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制

 

jstack java 堆栈跟踪工具

该命令主要用于生成虚拟机当前时刻的线程快照(threaddump/javacore文件),即当前虚拟机内每一条线程正在执行的方法的堆栈集合
目的

定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等;

以下命令用于打印除了堆栈外,显示相关锁的附加信息
jstack -l pid > jstack.log

格式如下
在这里插入图片描述
jmap 内存映像工具
该命令用于生成堆转存快照(heapdump/hpror文件)

生成dump文件:(注意 会触发一次full gc)
jmap -dump:live,format=b,file=heap.hprof pid

dump分析工具
推荐:Eclipse Memory Analyzer
下载地址:https://www.eclipse.org/mat/downloads.php
加载hprof文件后:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
由此基本可分析出些应用存在的问题,jdbc connection创建过多,且未回收到线程池

相关jdk自带的工具
如:
jconsole.exe
jvisualvm.exe

——————-完————————–

L (木秀林 林平行 行由心)
有道无术,术可成;有术无道,止于术

分类: JVM

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

蜀ICP备16001794号
© 2014 - 2024 linpxing.cn All right reserved.