JVM命令

jmap

描述:可以生成Java虚拟机的堆转储快照dump文件的命令行工具

查看整个JVM内存状态

jmap -heap [pid]

输出到文件

jmap -heap [pid] > jmap.log

查看JVM堆中对象详细占用情况

jmap -histo [pid]

导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具

jmap -dump:format=b,file=heapdump1.hprof [pid]
  • format=b:是通过二进制的意思
  • pid:进程号

jstack

描述:jstack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因

jstack [pid] test.txt
  • -F:有时候线程挂起的时候要加上-F参数才能把信息dump处理
  • -l:查出某个进程中运行的所有线程

Thread.State

状态/动作 描述
New 当线程对象创建时存在的状态,此时线程不可能执行
Runnable 当调用thread.start()后,线程变成为Runnable状态, 也就是就绪状态。只要得到CPU,就可以执行
Running 线程正在执行
Waiting 执行thread.join()或在锁对象调用obj.wait()等情况就会进该状态,表明线程正处于等待某个资源或条件发生来唤醒自己
Timed_Waiting 执行Thread.sleep(long)、thread.join(long)或obj.wait(long)等就会进该状态,与Waiting的区别在于Timed_Waiting的等待有时间限制
Dead 线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束
Deadlock 表示有死锁

jstat

输出heap各个分区大小

jstat -gc [pid]

间隔2s输出一次内存情况100次

jstat -gc [pid] 2s 100

各指标描述

  • S0C:年轻代中第一个survivor(幸存区)的容量 (字节 Capacity)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  • S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节 Used)
  • S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  • EC:年轻代中Eden(伊甸园)的容量 (字节)
  • EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
  • OC:Old代的容量 (字节)
  • OU:Old代目前已使用空间 (字节)
  • MC:metaspace(元空间)的容量 (字节)
  • MU:metaspace(元空间)目前已使用空间 (字节)
  • CCSC:当前压缩类空间的容量 (字节)
  • CCSU:当前压缩类空间目前已使用空间 (字节)
  • YGC:从应用程序启动到采样时年轻代中gc次数
  • YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC:从应用程序启动到采样时old代(全gc)gc次数
  • FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

jps

查看JAVA进程的PID

jps -lm
ps -ef | grep java

总结

  • jmap
    • 查看堆内存信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况,可以结合jhat使用
    • 主要用于分析OOM
  • jstack
    • 查看线程的栈信息,即JVM的当前时刻的线程快照。
    • 主要用于定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。
    • 建议间隔一定时间采集一次,通过3-5次采集,确认是否有线程一直处于running状态,方便定位是否出现第2点的情况
  • jstat
    • 主要用于统计堆内存、类相关和GC相关信息
    • 可以实时监控资源和性能

参考原文

版权声明:
作者:lhylwl
链接:http://ye-w.cn/index.php/2024/11/01/21.html
来源:泠耀博客-我的技术记录
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>