JVM常用命令与工具

201 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

jps

    查看系统中正在运行的JAVA进程
    -v : 显示JAVA进程详细信息

jinfo [-pid]

查看JVM配置参数,动态修改部分JVM参数

   -flags :打印当前指定java进程中已经设定的所有JVM参数信息

查看可动态修改的参数:java -XX:+PrintFlagsFinal -version | grep manageable

重点说明两个常用参数:

    1.  HeapDumpOnOutOfMemoryError :当JVM发生OOM时,自动生成dump文件

    2.  HeapDumpPath : 生成dump文件的路径 | 文件名称

线上环境发生OOM异常,如未设置这两个参数,要排查问题,就需要jmp来导出dump文件,可能会导致系统STW,
此时可以动态修改上面两个参数,当下次遇到OOM时,自动导出dump文件

开启参数:

    布尔类型: jinfo -flag + -参数 pid

    非布尔类型: jinfo -flag 参数名=参数值 pid

    一般会在启动JAVA进程的时候,设置JVM参数在遇到OOM时自动导出dump

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

jmap (谨慎使用,会导致STW)

查询JAVA进程内存使用情况、生成dump文件

常用命令:
    jmap -heap [pid] : 查看堆内存使用情况

    jmap -dump:live,format=b,file=文件名 [pid] :导出dump文件
    面试中千万不要说在生产环境中使用jmap导出dump,自己品
    还有一些jstat、jstack等命令,不在此描述了,推荐大家使用 arthas进行调优或监控JVM

jvisualvm.exe(工具)

JDK自带的监控JVM工具,可以分析dump文件等等

Eclipse Memory Analyzer(工具)

堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露等原因。

GCeasy (JVM日志分析工具)

该网站可以分析GC日志,以供快速分析出问题,当然还会给出优化建议等等(这个功能是收费的)

JVM开启GC日志

-XX:+PrintGCDetails  -XX:+PrintGCDateStamps -Xloggc:/home/xian/gc/gc-recognition.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10  -XX:GCLogFileSize=100M
  • -XX:PrintGCDetails:输出GC日志
  • -XX:PrintGCDateStamps:输出时间戳
  • -Xloggc:指定GC日志路径
  • -XX:+UseGCLogFileRotation:开启日志滚动
  • -XX:NumberOfGCLogFiles:指定日志文件数量
  • -XX:GCLogFileSize:设置日志文件大小
    此处不是重点,就讲这么多吧

点此进入

Arthas(JVM诊断工具)

推荐使用此工具,快速定位占用CPU高的线程、查看是否有死锁、动态监控方法入参出参、反编译,动态修改代码,实时更新等等,我粘用官方的一段话来介绍一下吧。

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas(阿尔萨斯)能为你做什么?

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从 JVM 内查找某个类的实例?

点此进入