jvm相关

  • dashboard——当前系统的实时数据面板
  • thread——查看当前 JVM 的线程堆栈信息
  • jvm——查看当前 JVM 的信息
  • sysprop——查看和修改JVM的系统属性
  • sysenv——查看JVM的环境变量
  • vmoption——查看和修改JVM里诊断相关的option
  • perfcounter——查看当前 JVM 的Perf Counter信息
  • logger——查看和修改logger
  • getstatic——查看类的静态属性
  • ognl——执行ognl表达式
  • mbean——查看 Mbean 的信息
  • heapdump——dump java heap, 类似jmap命令的heap dump功能
  • vmtool——从jvm里查询对象,执行forceGc | | | | | —- | —- | —- | | vmoption | 查看,更新VM诊断相关的参数 | | | thread | 查看当前线程信息,查看线程的堆栈 | | | memory | 查看JVM 内存信息。 | | | sysprop | 查看当前JVM的系统属性(SystemProperty) | |

Thread

查看当前线程信息,查看线程的堆栈,参数说明

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

查看

  1. thread
  2. Threads Total: 19, NEW: 0, RUNNABLE: 7, BLOCKED: 0, WAITING: 4, TIMED_WAITING: 3, TERMINATED: 0, I
  3. nternal threads: 5
  4. ID NAME GROUP PRIORIT STATE %CPU DELTA_TI TIME INTERRU DAEMON
  5. 21 arthas-command-execute system 5 RUNNABL 0.48 0.000 0:0.005 false true
  6. 1 main main 5 TIMED_W 0.13 0.000 0:0.093 false false
  7. -1 VM Periodic Task Thread - -1 - 0.08 0.000 0:0.066 false true
  8. 2 Reference Handler system 10 WAITING 0.0 0.000 0:0.001 false true
  9. 3 Finalizer system 8 WAITING 0.0 0.000 0:0.001 false true
  10. 4 Signal Dispatcher system 9 RUNNABL 0.0 0.000 0:0.000 false true
  11. 8 Attach Listener system 9 RUNNABL 0.0 0.000 0:0.024 false true
  12. 10 arthas-timer system 9 WAITING 0.0 0.000 0:0.000 false true
  13. 13 arthas-NettyHttpTelnetBo system 5 RUNNABL 0.0 0.000 0:0.028 false true
  14. 14 arthas-NettyWebsocketTty system 5 RUNNABL 0.0 0.000 0:0.001 false true
  15. 15 arthas-NettyWebsocketTty system 5 RUNNABL 0.0 0.000 0:0.001 false true
  16. 16 arthas-shell-server system 9 TIMED_W 0.0 0.000 0:0.000 false true
  17. 17 arthas-session-manager system 9 TIMED_W 0.0 0.000 0:0.000 false true
  18. 18 arthas-UserStat system 9 WAITING 0.0 0.000 0:0.000 false true
  19. 20 arthas-NettyHttpTelnetBo system 5 RUNNABL 0.0 0.000 0:0.069 false true
  20. -1 C1 CompilerThread1 - -1 - 0.0 0.000 0:0.378 false true
  21. -1 C2 CompilerThread0 - -1 - 0.0 0.000 0:0.479 false true
  22. -1 VM Thread - -1 - 0.0 0.000 0:0.060 false true
  23. -1 Service Thread - -1 - 0.0 0.000 0:0.000 false true

cpu使用率是如何统计出来的
这里的cpu使用率与linux 命令top -H -p 的线程%CPU类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。
工作原理说明:

  • 首先第一次采样,获取所有线程的CPU时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime()及sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()接口)
  • 然后睡眠等待一个间隔时间(默认为200ms,可以通过-i指定间隔时间)
  • 再次第二次采样,获取所有线程的CPU时间,对比两次采样数据,计算出每个线程的增量CPU时间
  • 线程CPU使用率 = 线程增量CPU时间 / 采样间隔时间 * 100%

注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。

查看最忙的线程,当前最忙的前N个线程并打印堆栈:

  1. $ thread -n 3
  2. "arthas-command-execute" Id=21 cpuUsage=0.2% deltaTime=0ms time=17ms RUNNABLE
  3. at sun.management.ThreadImpl.dumpThreads0(Native Method)
  4. at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:461)
  5. at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:206)
  6. at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122)
  7. at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
  8. at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
  9. at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
  10. at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
  11. at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
  12. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  13. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  14. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
  15. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
  16. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  17. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  18. at java.lang.Thread.run(Thread.java:748)
  19. "C1 CompilerThread1" [Internal] cpuUsage=0.11% deltaTime=0ms time=406ms
  20. "VM Periodic Task Thread" [Internal] cpuUsage=0.09% deltaTime=0ms time=193ms

常用命令举例

命令
thread -n 3 -i 1000 列出1000ms内最忙的3个线程栈
thread —state WAITING 查看指定状态的线程

JVM

参数说明

THREAD相关

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

    文件描述符相关

  • MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数

  • OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数

dashboard

命令可以查看当前系统的实时数据面板。