jvm内存分析相关资料 整理

    技术2026-03-14  6

    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

    -------------------完--------------------------

    Processed: 0.009, SQL: 9