一、jstat
常用于 GC 分析
jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态信息的命令行工具。它可以显示Java虚拟机中的类加载、内存、垃圾收集、即时编译等运行状态的信息。
1、语法
jstat -help
jstat -options vmid [interval] [count]
-options | 说明 |
---|---|
-class | 类加载统计,显示类加载、卸载数量、总空间和装载耗时的统计信息 |
-compiler | 编译统计,显示即时编译的方法、耗时等信息 |
-gc | 垃圾回收统计 |
-gccapacity | 堆内存统计 |
-gccause | 近一次GC统计和原因 |
-gcmetacapacity | 元数据空间统计 |
-gcnew | 新生代垃圾回收统计 |
-gcnewcapacity | 新生代内存统计 |
-gcold | 老年代垃圾回收统计 |
-gcoldcapacity | 老年代内存统计 |
-gcutil | 垃圾回收统计(百分比) |
-printcompilation | JVM编译方法统计 |
vmid
:虚拟机唯一ID(LVMID,Local Virtual Machine Identifier),如果查看本机就是Java进程的进程 ID(PID)
interval
:显示信息的时间间隔,单位默认毫秒
。也可以指定秒为单位,比如:1s。
如果指定了该参数,jstat 命令将每隔指定时间显示一次统计信息。
count
:显示统计数据的次数,默认值是无穷大,这将导致jstat命令一直显示统计信息,直到目标JVM终止或jstat命令终止。
各选项输出说明:https://www.jianshu.com/p/f02af8368a08
项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况
- 垃圾收集
- 运行期编译状况
- 类加载
2、垃圾收集
- -gc:垃圾回收统计
- -gcnew:新生代垃圾回收统计
- -gcold:老年代垃圾回收统计
- -gcutil:垃圾回收统计(百分比)
Name | 说明 |
---|---|
S0C | 第一个幸存区的大小(From Survivor 区大小) |
S1C | 第二个幸存区的大小(To Survivor 区大小) |
S0U | 第一个幸存区的使用大小 |
S1U | 第二个幸存区的使用大小 |
EC | 伊甸园区的大小(Eden 区大小) |
EU | 伊甸园区的使用大小 |
OC | 老年代大小 |
OU | 老年代使用大小 |
MC | 方法区大小 |
MU | 方法区使用大小 |
CCSC | 压缩类空间大小 |
CCSU | 压缩类空间使用大小 |
YGC | Young GC 代表Minor GC次数(系统迄今为止 YGC 次数) |
YGCT | Young GC Time 代表Minor GC耗时(YGC 耗时) |
FGC | Full GC 代表Full GC次数 |
FGCT | 老年代垃圾回收消耗时间 |
GCT | GC Time 代表Minor & Full GC共计耗时,垃圾回收消耗总时间(GC 总耗时,YGCT + FGCT) |
TT | 对象在新生代存活的次数 |
MTT | 对象在新生代存活的最大次数 |
DSS | Desired survivor size,期望幸存者大小 |
S0 | 第一个幸存区百分比 |
S1 | 第二个幸存区百分比 |
E | Eden 代表伊甸区使用百分比 |
O | Old 代表老年代使用百分比 |
M | Metaspace 元空间 |
CCS | 压缩类空间利用率为百分比 |
LGCC | 上次GC的原因 |
GCC | 当前GC的原因 |
3、运行期编译状况
- -gccapacity:堆内存统计
- -gcmetacapacity:元数据空间统计
- -gcnewcapacity:新生代内存统计
- -gcoldcapacity:老年代内存统计
- -compiler:编译统计
- -printcompilation:JVM编译方法统计
Name | 说明 |
---|---|
NGCMN | 新生代最小容量 |
NGCMX | 新生代最大容量 |
NGC | 当前新生代容量 |
S0C | 第一个幸存区大小 |
S1C | 第二个幸存区的大小 |
EC | 伊甸园区的大小 |
OGCMN | 老年代最小容量 |
OGCMX | 老年代最大容量 |
OGC | 当前老年代大小 |
OC | 当前老年代大小 |
MCMN | 最小元数据容量 |
MCMX | 最大元数据容量 |
MC | 当前元数据空间大小 |
CCSMN | 最小压缩类空间大小 |
CCSMX | 最大压缩类空间大小 |
CCSC | 当前压缩类空间大小 |
YGC | 年轻代 gc 次数 |
FGC | 老年代 GC 次数 |
S0CMX | 最大幸存1区大小 |
S1CMX | 最大幸存2区大小 |
ECMX | 最大伊甸园区大小 |
4、类加载
- -class 类加载统计
Name | 说明 |
---|---|
Loaded | 加载class的数量 |
Bytes | 所占用空间大小 |
Unloaded | 未加载数量 |
Bytes | 未加载占用空间 |
Time | 时间 |
Compiled | 编译任务的数目 |
Failed | 失败数量 |
Invalid | 不可用数量 |
Time | 时间 |
FailedType | 失败类型 |
FailedMethod | 失败的方法 |
Size | 方法生成的字节码的大小 |
Type | 编译类型 |
Method | 方法 |
5、GC 原因
enum Cause {
_java_lang_system_gc, // System.gc()触发
_full_gc_alot,
_scavenge_alot,
_allocation_profiler,
_jvmti_force_gc, // JVMTI(JVM Tool Interface)触发
_gc_locker, // 通过jni方式操作数组或者是字符串的时候,为了避免GC过程移动数组或字符串的内存地址,jvm实现了一个GC_locker,最后一个位于jni临界区内的线程退出临界区时,发起一次CGCause为_gc_locker的GC.
_heap_inspection, // jamp -hisot:live命令时会触发
_heap_dump, // dump 堆
_wb_young_gc, // whitebox测试
_wb_conc_mark,
_update_allocation_context_stats_inc,
_update_allocation_context_stats_full,
/* implementation independent, but reserved for GC use */
_no_gc,
_no_cause_specified,
_allocation_failure, // 内存分配失败触发的GC
/* implementation specific */
_tenured_generation_full,
_metadata_GC_threshold, // metaspace区域分配时分配不下,从而触发的GC
_cms_generation_full,
_cms_initial_mark, // CMS回收器初始标记
_cms_final_remark, // CMS回收器最终标记
_cms_concurrent_mark, // CMS回收器
_old_generation_expanded_on_last_scavenge,
_old_generation_too_full_to_scavenge,
_adaptive_size_policy, // ps中动态调整堆以及各个区大小时
_g1_inc_collection_pause, // G1分配不下触发的GC
_g1_humongous_allocation, // 分配超大对象失败时触发GC
_last_ditch_collection, // metaspace区域分配不下时,最后的一次回收
_last_gc_cause
};
5、示例
jstat -gc PID time count
示例:jstat -gc 82 1000 40
说明:每隔 1 秒输出一次进程号为 12141 的 GC 情况,共输出 40 次,结果如下图
示例集:
https://blog.csdn.net/wangshuminjava/article/details/107041189?utm_source=app&app_version=5.3.1
二、jmap
常用于内存分析
jmap (Memory Map for Java) 命令用于生成堆转储快照 (一般称为 heapdump 或 dump 文件)。
jmap 的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
1、语法
【用法】
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats to print class loader statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system
【参数】
参数 | 说明 |
---|---|
option | 选项参数,不可同时使用多个选项参数 |
pid | Java进程id |
executable | 产生核心dump的Java可执行文件 |
core | 需要打印配置信息的核心文件 |
remote-hostname-or-ip | 远程调试的主机名或ip |
server-id | 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标示服务器 |
【option 参数】
选项 | 说明 |
---|---|
heap | 显示 Java 堆详细信息 |
histo | 输出 java heap 对象直方图数据,如果指定了 live,则仅仅统计存活的对象 |
clstats | Java 堆中内存的类加载器的统计信息 |
finalizerinfo | 输出等待序列的对象信息 |
dump <dump-options> | 生成堆转储快照,输出 Java heap 信息到 hprof 格式的二进制文件 dump-options: live:仅输出堆中存活对象信息;如果没有指定则输出堆中所有对象信息。 format=b:二进制格式 file=<file>:输出堆信息到文件 示例:jmap -dump:live,format=b,file=heap.bin <pid> |
F | 当 -dump 没有响应时,强制生成 dump 快照 |
2、示例
示例集:http://t.zoukankan.com/lujiango-p-9002270.html
# dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名。
jmap -dump:live,format=b,file=dump.hprof 129665
dump.hprof 这个文件可以通过工具(如 eclipse)打开:
# 打印heap的概要信息,GC使用的算法,heap的配置和使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
jmap -heap 129665
# 打印等待回收的对象信息
jmap -finalizerinfo 129665
# Number of objects pending for finalization:0 说明当前F-Queue队列中并没有等待Finalizer线程执行finalizer方法的对象。
# 打印堆的对象统计,包括对象数、内存大小等。jmap -histo:live这个命令执行,JVM会先触发gc,然后再统计信息
jmap -histo:live 129665
# 打印Java类加载器的智能统计信息,对于每个类加载器而言,对于每个类加载器而言,它的名称,活跃度,地址,父类加载器,它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印
jmap -clstats 129665
# 强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项
-F
例:jmap -F -histo 129665 | grep com.netflix