02-Arthas中JVM相关命令

0 学习目录

  1. 01-Arthas安装与快速入门
  2. 02-Arthas中JVM相关命令
  3. 03-Arthas中class或classloader相关命令
  4. 04-Arthas中方法相关命令
  5. 05-Arthas常用实战积累

1. dashboard 仪表盘

1.1 作用

显示当前系统的实时数据面板,按q或ctrl + c 退出

1.2 效果

[arthas@32554]$ dashboard

image-20210130182430768

1.3 数据说明

  • ID:Java级别的线程ID,注意这个ID不能跟jstack中的nativeID 对应。
  • NAME:线程名。
  • GROUP:线程组名。
  • PRIORITY:线程优先级,1~10之间的数字,越大代表级别越高。
  • STATE:线程的状态。
  • CPU%:线程消耗的CPU占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
  • TIME:线程运行总时间,数据格式为分:秒
  • INTERUPTED:线程当前的中断位状态
  • DEAMON:是否是daemon线程

2. thread 线程相关命令

2.1 作用

查看当前JVM的线程堆栈信息

2.2 参数说明

参数名称参数说明
数字线程id
[n ]指定最忙的前N个线程并打印堆栈
[b]找出当前阻塞其他线程的线程
[i ]指定cpu占比统计的采样间隔,单位为毫秒

2.3 举例

# 展示当前最忙的前三个线程并打印堆栈
thread -n 3

image-20210130184344474

# 找出当前阻塞其他线程的线程
thread -b

image-20210130184530862

# 找到1000ms内最繁忙的前三个线程并打印
thread -i 1000 -n 3

image-20210130185249708

# 查看处于等待状态的线程
thread --state WAITING

image-20210130185350802

3. jvm

3.1 作用

查看当前JVM的信息

3.2 效果

[arthas@32554]$ jvm

image-20210203171944195

3.3 jvm命令中thread相关

  • COUNT: JVM当前活跃的线程数
  • DAEMON-COUNT: JVM当前活跃的守护线程数
  • PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数
  • STARTED-COUNT: 从JVM启动开始总共启动过的线程次数
  • DEADLOCK-COUNT: JVM当前死锁的线程数

4. sysprop

4.1 作用

查看当前JVM的系统属性(System Property)

4.2 使用方式

  1. 查看所有属性

    [arthas@32554]$ sysprop
     KEY                                           VALUE                                                                                                                                                                                  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     awt.toolkit                                   sun.awt.X11.XToolkit                                                                                                                                                                   
     file.encoding.pkg                             sun.io                                                                                                                                                                                 
     java.specification.version                    1.8                                                                                                                                                                                    
     sun.cpu.isalist                                                                                                                                                                                                                      
     sun.jnu.encoding                              UTF-8                                                                                                                                                                                  
     java.class.path                               arthas-demo.jar                                                                                                                                                                        
     java.vm.vendor                                Oracle Corporation                                                                                                                                                                     
     sun.arch.data.model                           64                                                                                                                                                                                     
     java.vendor.url                               http://java.oracle.com/                                                                                                                                                                
     user.timezone                                 Asia/Shanghai                                                                                                                                                                          
     os.name                                       Linux                                                                                                                                                                                  
     java.vm.specification.version                 1.8                                                                                                                                                                                    
     user.country                                  CN                                                                                                                                                                                     
     sun.java.launcher                             SUN_STANDARD                                                                                                                                                                           
     sun.boot.library.path                         /usr/java/jdk1.8.0_271-amd64/jre/lib/amd64                                                                                                                                             
     sun.java.command                              arthas-demo.jar                                                                                                                                                                        
     sun.cpu.endian                                little                                                                                                                                                                                 
     user.home                                     /home/ligen                                                                                                                                                                            
     user.language                                 zh                                                                                                                                                                                     
     java.specification.vendor                     Oracle Corporation                                                                                                                                                                     
     java.home                                     /usr/java/jdk1.8.0_271-amd64/jre                                                                                                                                                       
     file.separator                                /                                                                                                                                                                                      
     line.separator   
     ......
    
  2. 查看单个属性

    [arthas@32554]$ sysprop user.country 
     KEY                                           VALUE                                                                                                                                                                                  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     user.country                                  CN            
    
  3. 修改单个属性

    [arthas@32554]$ sysprop user.country US
    Successfully changed the system property.
     KEY                                           VALUE                                                                                                                                                                                  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     user.country                                  US                
    

5. sysenv

5.1 作用

查看当前JVM的环境属性(System Environment Variables)

5.2 使用方式

  1. 查看所有环境变量

    [arthas@32554]$ sysenv
     KEY                                           VALUE                                                                                                                                                                                  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     PATH                                          /usr/lib64/ccache:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jiangwe/gopack/bin:/usr/java/latest/bin:/usr/java/latest/jre/bin:/mnt/apache-maven-3.6.3/bin:/home/jiangwe/m 
                                                   ongodb/bin:/home/ligen/.local/bin:/home/ligen/bin                                                                                                                                      
     HISTCONTROL                                   ignoredups                                                                                                                                                                             
     HISTSIZE                                      1000                                                                                                                                                                                   
     JAVA_HOME                                     /usr/java/latest                                                                                                                                                                       
     TERM                                          xterm                                                                                                                                                                                  
     LANG                                          zh_CN.UTF-8                                                                                                                                                                            
     XDG_SESSION_ID                                914                                                                                                                                                                                    
     SELINUX_LEVEL_REQUESTED                                                                                                                                                                                                              
     SELINUX_ROLE_REQUESTED                                                                                                                                                                                                               
     MAIL                                          /var/spool/mail/ligen                                                                                                                                                                  
     LOGNAME                                       ligen                                                                                                                                                                                  
     PWD                                           /home/ligen/.arthas/lib/3.4.6/arthas                                                                                                                                                   
     _                                             /usr/bin/java                                                                                                                                                                          
     LESSOPEN                                      ||/usr/bin/lesspipe.sh %s                                                                                                                                                              
     SHELL                                         /bin/bash                                                                                                                                                                              
     SELINUX_USE_CURRENT_RANGE                                                                                                                                                                                                            
     SSH_TTY                                       /dev/pts/2                                                                                                                                                                             
     SSH_CLIENT                                    10.8.0.4 60576 22                                                                                                                                                                      
     OLDPWD                                        /home/ligen                                                                                                                                                                            
     GOPATH                                        /home/jiangwe/gopack                                                                                                                                                                   
     USER                                          ligen                                                                                                                                                                                  
     JAVA_JRE                                      /usr/java/latest/jre                                                                                                                                                                   
     SSH_CONNECTION                                10.8.0.4 60576 10.8.0.3 22                                                                                                                                                             
     HOSTNAME                                      center_server                                                                                                                                                                          
     M2_HOME                                       /mnt/apache-maven-3.6.3                                                                                                                                                                
     XDG_RUNTIME_DIR                               /run/user/1001                                                                                                                                                                         
     HOME                                          /home/ligen                                                                                                                                                                            
     SHLVL                                         1                                                            
    
  2. 查看单个环境变量

    [arthas@32554]$ sysenv USER
     KEY                                           VALUE                                                                                                                                                                                  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     USER                                          ligen                                                                                                                                                                                  
    
    

6. vmoption

6.1 作用

查看,更新VM诊断相关的参数

6.2 使用方式

  1. 查看所有的虚拟机option

    [arthas@28896]$ vmoption
    

    image-20210228135024299

  2. 查看指定的option

    [arthas@28896]$ vmoption PrintGCDetails 
    

    image-20210228135219048

  3. 更新指定的option

    #将打印垃圾回收详细信息的值更新为true
    [arthas@28896]$ vmoption PrintGCDetails true
    

    image-20210228135323168

    查看更新结果

    image-20210228135417384

7. getstatic

7.1 作用

通过getstatic命令可以方便的查看类的静态属性。(推荐使用ognl语法替代)

7.2 使用方式

  1. getstatic 类名 属性名

    可以返回

    [arthas@28896]$ getstatic demo.MathGame random
    field: random  #静态属性名
    @Random[       #静态属性中的参数信息
        serialVersionUID=@Long[3905348978240129619],
        seed=@AtomicLong[189071598934274],
        multiplier=@Long[25214903917],
        addend=@Long[11],
        mask=@Long[281474976710655],
        DOUBLE_UNIT=@Double[1.1102230246251565E-16],
        BadBound=@String[bound must be positive],
        BadRange=@String[bound must be greater than origin],
        BadSize=@String[size must be non-negative],
        seedUniquifier=@AtomicLong[3620162808252824828],
        nextNextGaussian=@Double[0.0],
        haveNextNextGaussian=@Boolean[false],
        serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
        unsafe=@Unsafe[sun.misc.Unsafe@5e07aa3c],
        seedOffset=@Long[24],
    ]
    Affect(row-cnt:1) cost in 10 ms.
    
  2. 指定classLoader

    注意hashcode是变化的,需要先查看当前的ClassLoader信息,使用sc -d <ClassName>提取对应ClassLoader的hashcode。

    image-20210228140528451

    使用-c,来查看静态变量信息

    [arthas@28896]$ getstatic -c 70dea4e demo.MathGame random
    #显示结果同 getstatic 类名 变量名
    
  3. 对于只有唯一实例的ClassLoader可以通过--classLoaderClass指定class name,使用起来更加方便

    [arthas@28896]$ getstatic --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame random
    #显示结果同 getstatic 类名 变量名
    
    • 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda目前环境是java8。

8. ongl

8.1 作用

执行ognl表达式,实现一些复杂操作

8.2 使用参考

  • OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71
  • OGNL表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html

8.3 使用方式

  1. 调用静态函数

    [arthas@28896]$ ognl '@java.lang.System@out.println("hello")'
    null
    
  2. 获取静态类的静态字段:

    [arthas@28896]$ ognl '@demo.MathGame@random'
    @Random[
        serialVersionUID=@Long[3905348978240129619],
        seed=@AtomicLong[129118463827641],
        multiplier=@Long[25214903917],
        addend=@Long[11],
        mask=@Long[281474976710655],
        DOUBLE_UNIT=@Double[1.1102230246251565E-16],
        BadBound=@String[bound must be positive],
        BadRange=@String[bound must be greater than origin],
        BadSize=@String[size must be non-negative],
        seedUniquifier=@AtomicLong[3620162808252824828],
        nextNextGaussian=@Double[0.0],
        haveNextNextGaussian=@Boolean[false],
        serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
        unsafe=@Unsafe[sun.misc.Unsafe@5e07aa3c],
        seedOffset=@Long[24],
    ]
    
    
  3. 执行多行表达式,赋值给临时变量,返回一个List

    [arthas@28896]$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
    
    @ArrayList[
        @String[/usr/java/jdk1.8.0_271-amd64/jre],
        @String[Java(TM) SE Runtime Environment],
    ]
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      
Arthas是一个非常方便的Java应用性能诊断工具,可以帮助我们监控和分析JVM线程。 Arthas通过所谓的"剖析"对JVM线程进行监控。"剖析"是指在运行时对目标应用程序进行代码注入和操作,从而获取应用程序的运行信息。Arthas使用了Java的Instrumentation API,以字节码增强的方式,动态修改目标类的代码,使之能够收集和输出线程相关的信息。 使用Arthas监控JVM线程非常简单。首先,我们需要在目标Java应用程序的启动命令加入Arthas的Agent参数,例如: java -jar arthas-boot.jar 然后,我们可以使用命令"thread"来监控JVM线程。例如,我们可以使用"thread"命令来查看当前所有线程的堆栈信息,包括线程ID、线程名称、线程状态以及调用栈信息。 另外,Arthas还提供了一些其他的命令来更细粒度地监控线程。比如:"thread -n 5"可以指定仅显示前5个线程的堆栈信息,"thread -t 1"可以指定只显示处于RUNNABLE状态的线程。 此外,Arthas还提供了丰富的过滤条件,用于更准确地筛选要监控的线程。比如,我们可以使用"thread -n 5 -p xxx"来查看线程名称含有"xxx"的前5个线程的信息。 总而言之,通过Arthas,我们可以方便地监控JVM线程,了解线程的状态和调用栈信息,帮助我们进行应用程序的性能分析和故障排查。使用Arthas,我们可以及时发现线程问题,并采取相应的措施来优化我们的Java应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值