JVM常用命令工具和图形化工具

Posted 可——叹——落叶飘零

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM常用命令工具和图形化工具相关的知识,希望对你有一定的参考价值。

文章目录

命令工具

jps检索进程

jps -l 输出主类的全名,如果进程执行的是Jar包则输出Jar路径
jps -v 输出虚拟机进程启动时JVM参数

jstat分代信息运行状态信息

监视虚拟机各种运行状态信息的命令行工具

jstat -gc pid [刷新毫秒] [打印条数]

 S0C:第一个幸存区的大小
 S1C:第二个幸存区的大小
 S0U:第一个幸存区的使用大小
 S1U:第二个幸存区的使用大小
 EC:伊甸园区的大小
 EU:伊甸园区的使用大小
 OC:老年代大小
 OU:老年代使用大小
 MC:方法区大小
 MU:方法区使用大小
 CCSC:压缩类空间大小
 CCSU:压缩类空间使用大小
 YGC:年轻代垃圾回收次数
 YGCT:年轻代垃圾回收消耗时间
 FGC:老年代垃圾回收次数
 FGCT:老年代垃圾回收消耗时间
 GCT:垃圾回收消耗总时间

jinfo实时地查看和调整虚拟机各项参数

jinfo pid

jmap生成堆转储快照

查看类的数量和所占大小,输出前30行
jmap -histo pid | head -30   或者|more分页查看
查看堆内存情况
jmap -heap pid
生成堆内存快照到指定目录
jmap -dump:format=b,file=/home/path/yyyyMMdd.hprof pid
通常在启动java程序的时候设置启动参数,发生OOM了自动dump
-XX:+HeapDumpOnOutOfMemoryError
指定输出目录
-XX:HeapDumpPath=/home/xx/dump

jhat分析jmap生成的堆转储快照(耗性能,用的少)

jhat内置了一个微型的HTTP/html服务器,生成dump文件的分析结果后,可以在浏览器中查看
localhost:7000

jhat /xx/xx.hprof

jstack生成虚拟机当前时刻的线程快照(可检查线程死锁)

可以结合|more分页

jstack -l pid

线程死锁,可以看到具体类方法行数发生的死锁

并打印各个线程调用方法信息

其他命令

启动参数打印GC日志

通常只要-XX:+PrintGCDetails即可

-verbose:gc  -XX:+PrintGCDetails

parallelScavenge 和 parallelOld下 吞吐量命令

吞吐量=运行用户代码的时间/CPU总时间

-XX:ParallelGCThreads=8 线程数
-XX:MaxGCPauseMillis=1000 每次GC最大的停顿毫秒数,参数GC停顿时间,这个参数配置太小的话会发生频繁GC
-XX:GCTimeRatio吞吐量参数,99%

启动参数指定垃圾回收器命令

以下无空格相邻的是常用新生代老年代组合

-XX:+UseSerialGC         指定Serial/Serial Old

-XX:+UseParallelGC       新生代指定parallelScavenge
-XX:+UseParallelOldGC    指定老年代parallelOld

-XX:+UseParNewGC         指定ParNew收集器
-XX:+UseConcMarkSweepGC  指定Concurrent Mark Sweep(CMS)垃圾收集器

-XX:+UseG1GC             指定G1

内存参数命令

这 3 个参数限制了 Java 堆大小为 20 MB,不可扩展,其中 10 MB 分配给新生代,剩下的 10 MB 分配给老年代。
虚拟机提供了一个-XX: PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制

-Xms20M 设置JVM初始内存为20M
-Xmx20M 设置JVM最大内存为20M
-Xmn10M 设置年轻代内存大小为10M
-Xx: SurvivorRatio= 8 决定了新生代中 Eden 区与两个 Survivor 区的空间比例是 8:1
-XX:PretenureSizeThreshold=3145728   设置大对象的大小(3M) 1024*1024*3=3145728

逃逸分析和栈上分配命令

逃逸分析

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,
譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸
栈上分配

栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后自动销毁,而不需要垃圾回收的介入,从而提高系统性能

-XX:+DoEscapeAnalysis开启逃逸分析可以执行栈上分配(jdk1.8默认开启,其它版本未测试)
-XX:-DoEscapeAnalysis 关闭逃逸分析

启动打印日志输出命令行

-XX:+PrintCommandLineFlags

可视化工具

jconsole

jvisualvm

jvisualvm比jconsole更强大,一般生产上不直接用图像工具

专业工具
arthas

排查流程

top查看占用较大资源进程
top -Hp pid 找到占用较大的线程编号 结合 jstack pid查看对应的线程
jstack查看的可能是 gc线程 或者 业务线程

如果是gc -> 一定是频繁gc导致线程飙高 -> 读gc日志

如果是业务 -> 查看对应线程调用的方法

以上是关于JVM常用命令工具和图形化工具的主要内容,如果未能解决你的问题,请参考以下文章

jvm 图形化工具之jconsole

MySQL常用图形化管理工具

UAVStack JVM监控分析工具:图形化展示采集及分析监控数据

JVM参数配置&&命令工具

MySQL GUI图形化界面常用软件推荐

JVM虚拟机专题之图形化监控工具-VisualVM