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常用命令工具和图形化工具的主要内容,如果未能解决你的问题,请参考以下文章