• 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
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    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] 
            (to connect to running process)
        jmap [option] 
            (to connect to a core file)
        jmap [option] [server_id@]
            (to connect to remote debug server)
    
    where 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    【参数】

    参数说明
    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 生成堆转储快照,输出 Java heap 信息到 hprof 格式的二进制文件

    dump-options:
     live:仅输出堆中存活对象信息;如果没有指定则输出堆中所有对象信息。
     format=b:二进制格式
     file=:输出堆信息到文件
     示例:jmap -dump:live,format=b,file=heap.bin
    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

  • 相关阅读:
    基于Matlab求解高教社杯全国大学生数学建模竞赛(CUMCM2004A题)-奥运会临时超市网点设计(附上源码+数据)
    一、【VUE-CLI】Vue CLI 脚手架介绍及安装
    对工厂模式一次感悟
    计算机毕业设计(附源码)python忆居民宿管理
    [思维]Longest Common Subsequence 2022牛客多校第8场 F
    携手低代码平台公司,创造高效率办公!
    opencv图像水平/竖直拼接hconcat()/vconcat()
    python基于用户兴趣的java影视推荐系统django
    微服务架构设计模式
    [附源码]java毕业设计会议室会议管理系统
  • 原文地址:https://blog.csdn.net/weixin_42725107/article/details/126659968