常用于 GC 分析
jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态信息的命令行工具。它可以显示Java虚拟机中的类加载、内存、垃圾收集、即时编译等运行状态的信息。
jstat -helpjstat -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代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况
| 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的原因 |
| 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 | 最大伊甸园区大小 |
| Name | 说明 |
|---|---|
| Loaded | 加载class的数量 |
| Bytes | 所占用空间大小 |
| Unloaded | 未加载数量 |
| Bytes | 未加载占用空间 |
| Time | 时间 |
| Compiled | 编译任务的数目 |
| Failed | 失败数量 |
| Invalid | 不可用数量 |
| Time | 时间 |
| FailedType | 失败类型 |
| FailedMethod | 失败的方法 |
| Size | 方法生成的字节码的大小 |
| Type | 编译类型 |
| Method | 方法 |
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
};
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 (Memory Map for Java) 命令用于生成堆转储快照 (一般称为 heapdump 或 dump 文件)。
jmap 的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
【用法】
Usage:
jmap [option]
(to connect to running process)
jmap [option]
(to connect to a core file)
jmap [option] [server_id@]
(to connect to remote debug server)
where 【参数】
| 参数 | 说明 |
|---|---|
| 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 | 生成堆转储快照,输出 Java heap 信息到 hprof 格式的二进制文件 dump-options: live:仅输出堆中存活对象信息;如果没有指定则输出堆中所有对象信息。 format=b:二进制格式 file= 示例:jmap -dump:live,format=b,file=heap.bin |
| F | 当 -dump 没有响应时,强制生成 dump 快照 |
示例集: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