JVM相关工具

JVM可以用到的一些工具命令

开启GC日志

-XX:+PrintGC
-Xloggc:/log/gc-%t.log
-XX:+PrintGCDetails

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=

GC日志相关参数: 参考

参数作用
-XX:+PrintGC开启GC日志
-Xloggc:/data/log/gc-%t.log指定日志文件(%t:YYYY-MM-DD_HH-MM-SS)
-XX:+PrintGCDetails输出GC详细信息
-XX:+PrintGCDateStamps每条日志前的时间戳(格式化的系统时间字符串)
-XX:+PrintGCTimeStamps每条日志前的时间戳
-XX:+UseGCLogFileRotation开启循环分割
-XX:NumberOfGCLogFiles=5GC log 文件数,达到上限会删除第一个
GCLogFileSize=20M单个GC log 文件最大容量
  • 不建议循环分割日志,建议输出单个文件,通过数据采集到日志平台;

命令

  1. jps
    :找到JVM进程 PID;
  2. top
    :查看进程运行详情:
  3. 查看进程下的线程详情:
    • top:
      top -Hp [进程id]
      :显示当前进程下所有线程的Id和内存、CPU使用情况;
    • ps:输出进程下所有线程及CPU使用情况
      ps H -eo pid, tid, %cpu | grep [进程id]
  4. 获取线程堆栈详情:
    jstack [tid]
    • jstack -l [PID] >/tmp/log.txt
      输出到文件;
  5. 输出的线程详情中的nid,通常为十六进制,需要将tid换算成十六进制;
    • printf '%x\n' [pid]
      :10进制转16禁止;
  6. jmap
    :查询某一时刻的内存占用情况
    • jmap -heap [pid]
    • jmap -histo [pid] > jvm.txt
      :获取详细的对象内存占用情况
 num  #instances   #bytes  class name
----------------------------------------------
351:      10        160   com.snippet.xxx.Task
370:       3        144   org.j.p.e.s.h.NodeTestTask                           
474:       3         72   org.j.p.e.s.h.NodeTestTask$DefaultDynamicTestExecutor
577:       3         48   org.j.p.e.s.h.NodeTestTask$$Lambda$212/825658265     

Athas

无论是开发还是生产都很有用;

TODO