30.jvm命令行监控工具

jps

查看java进程信息

jps [-q] [-mlvV] []

  • -q 静默模式 只输出pid
  • -m 查看运行java命令带的参数 如 main 方法的args参数
  • -l 显示类的全名
  • -v 显示程序配置的jvm参数 如-xms2g
  • -V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件

jinfo

查看java进程的JVM参数

image-20210223151401775

可选的option

  • -flag 打印某一个jvm的参数值 如 jinfo -flag MaxHeapSize pid

  • -flag [+|-] 启动或停用某一个JVM参数 如 jinfo -flag +UseSerialGC pid 启动SerialGC

  • -flag = 动态设置某一个JVM参数的值,并不是所有JVM参数都支持动态 只有标注了managealbe的才能支持动态设置

    image-20210223150152552

  • -flags 打印某一个java进程所有的JVM参数

  • -sysprops 打印 java系统参数 比如查看java的时区编码等信息

    image-20210223150613275

扩展

查看java进程默认的JVM参数

  • java -XX:+PrintFlagsInitial 查看JVM初始化的启动参数
  • java -XX:+PrintFlagsFinal 查看JVM最终的参数
  • java -XX:+PrintCommandLineFlags 查看用户设置或者被java虚拟机设置过的参数

jstat

查看JVM的统计信息

image-20210223151337956

  • option 可选的统计项目
  • vmid 本地的虚拟机就是java进程的pid
  • lines 输出多少行之后打印标题头信息
  • interval 间隔多久采样一次 如interval 500ms 或者 1s 默认单位是ms
  • count 采样几次 如果不设置就一直采样

常用的options

  • -gc 显示与GC相关的堆信息

    image-20210223152735537

S0C survivor0区的容量
S1C survivor1区的容量
S0U survivor0区的已经使用的容量
S1U survivor1区的已经使用的容量
EC 伊甸园区Eden的容量
EU 伊甸园区Eden的已经使用的容量
OC 老年代Old区的容量
OU 老年代Old区已经使用的容量
MC 方法区MethodArea的容量
MU 方法区 MethodArea已经使用的容量
CCSC 压缩类空间的容量
CCSU 压缩类空间已经使用的容量
YGC 新生代GC执行的次数
YGCT 新生代GC执行花费的时间
FGC 老年代GC执行次数
FGCT 老年代GC花费的时间
GCT GC花费的总时间

  • -gccapacity 与-gc基本相同主要输出的GC各个分区容量信息

    image-20210223153419599

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数

  • -gcutil 显示内容与-gc基本相同,但是输出的形式是百分号

    image-20210223153447693

  • -gccause 与-gcutil性能一样,但是会额外输出导致最后一次或当前发生GC产生的原因 LGCC

    image-20210223153837249

  • -gcnew 显示新生代GC情况

  • -gcnewcapacity 显示内容与-gcnew 相同但是只关注容量信息

  • -gcold 显示老年代状态

  • -class 显示ClassLoaer的相关信息 类状态 卸载数量 总空间 加载类的耗时时间等

    image-20210223155100769

jmap

导出内存映射文件和内存的试用情况

image-20210223155234018

  • -heap 打印堆栈汇总信息 包含堆栈各个分区容量 Eden S0 S1 Old的使用情况

    image-20210223155449312

  • -histo[:live] -histo[:live] 堆空间对象的统计信息 包括对象的实例个数 占用大小 对象名称 生产建议带上:live 只统计存活的对象

image-20210223162006801

  • -dump[:live] 生成堆空间转储快照 dump文件 -dump:live只保存堆中存活对象 常用dump命令

手动方式

jmap -dump:format=b,file=<filename.hprof> pid

jmap -dump:live,format=b,file=<filename.hprof> pid

自动方式 建议在生产都加上这个参数 方便如果出现OOM找到当时的内存快照排查问题

-XX:+HeapDumpOnOutOfMemoryError

-XX:+HeapDumpPath=<filename.hprof>

  • -clstat 查看ClassLoader信息
  • -finalizerinfo 查看finalizer队列中的对象

jmap小结

由于jmap访问堆中所有对象,为保证此过程不会被应用程序干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态.jmap导出的快照必定是安全点位置.这可能导致基于该快照的分析结果存在偏差

如编译生成的机器码中,某些对象的生命周期在两个安全点之间,那么:live选项无法感知这些对象

如果某一个线程长时间无法跑到安全点,将导致jmap一直等下去与jstat不同,GC会主动将jstat所需要的摘要数据保存在固定位置,jstat直接去读取即可

jstack

用于生成虚拟机指定进程当前时刻的线程快照.线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈信息集合

可以用于定位出现长时间停顿的原因,如吸纳成死锁 死循环 请求外部资源长时间等待等问题.当线程出现停顿的时候,可以使用jstack显示各个线程的调用堆栈情况

image-20210223171422773

  • -F 强制获取线程快照
  • -m 打印java和本地方法的堆栈
  • -l 显示关于锁的附加信息

jstack option pid

如果需要jstack支持管理远程需要在远程程序中添加一系列启动参数,开启JMX远程监控

public class DeadLockTest {

    public static void main(String[] args) throws InterruptedException {
        Object lockA = new Object();
        Object lockB = new Object();

        new Thread() {
            @Override
            public void run() {
                synchronized (lockA) {
                    System.out.println("get lockA");
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lockB){
                        System.out.println("get lockB");
                    }
                }
            }
        }.start();
        TimeUnit.MILLISECONDS.sleep(200);
        new Thread() {
            @Override
            public void run() {
                synchronized (lockB) {
                    System.out.println("get lockB");
                    synchronized (lockA){
                        System.out.println("get lockA");
                    }
                }
            }
        }.start();
    }
}

image-20210223172219109

jcmd

聚合多个监控命令的管理工具

jcmd [pid | main-class] command...|PerfCounter.print| 
-f filename
  • jcmd -l 查看所有的JVM进程 类似jps

  • -f 从文件中读取执行命令

  • jcmd pid help 针对指定进程列出所有支持的命令

    image-20210223175129235

  • jcmd pid 具体命令 显示制定的命令的数据 常见如Thread.print类似jstack GC. heap_dump <file.hprof>类似jmap -dump

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值