002-JVM 常用命令

一、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垃圾回收统计(百分比)
-printcompilationJVM编译方法统计                            

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压缩类空间使用大小
YGCYoung GC 代表Minor GC次数(系统迄今为止 YGC 次数)
YGCTYoung GC Time 代表Minor GC耗时(YGC 耗时)
FGCFull GC 代表Full GC次数
FGCT老年代垃圾回收消耗时间
GCTGC Time 代表Minor & Full GC共计耗时,垃圾回收消耗总时间(GC 总耗时,YGCT + FGCT)
TT对象在新生代存活的次数
MTT对象在新生代存活的最大次数
DSSDesired survivor size,期望幸存者大小
S0第一个幸存区百分比
S1第二个幸存区百分比
EEden 代表伊甸区使用百分比
OOld 代表老年代使用百分比
MMetaspace 元空间
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 原因

https://github.com/dmlloyd/openjdk/blob/jdk8u/jdk8u/hotspot/src/share/vm/gc_interface/gcCause.hpp#L39

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选项参数,不可同时使用多个选项参数
pidJava进程id
executable产生核心dump的Java可执行文件
core需要打印配置信息的核心文件
remote-hostname-or-ip远程调试的主机名或ip
server-id可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标示服务器

【option 参数】

选项说明
heap显示 Java 堆详细信息
histo输出 java heap 对象直方图数据,如果指定了 live,则仅仅统计存活的对象
clstatsJava 堆中内存的类加载器的统计信息
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值