一.文章介绍
首先带我们先来了解下JVM的内存结构:
- Metaspance = Class、Package、Method、Field、字节码、常量池、符号引用等等。
- CCS = 32位指针的Class(压缩类空间)
- CodeCache = JIT编译后的本地代码、JNI使用的C代码
二JNI.基于JDK命令行工具的监控
1.JVM的参数类型
1.标准参数:功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数
2.X参数:非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索
-Xint:解释执行
-Xcomp :第一次使用就编译成本地代码
-Xmixed :混合模式,JVM自己来决定是否编译成本地代码
3.XX参数:非标准 很长一段时间不会列出来 用于JVM开发的debug和调优
boolean : -XX:+UseConcMarkSweepGC :启用CMS垃圾收集器
-XX:+UseG1GC :启用G1 垃圾收集器
非boolean类型 : -XX:MaxGCPauseMillis=500 //young区GC的回收的时间
-XX:GCTimeRatio=19 //吞吐量 也就是垃圾回收时间和非垃圾回收时间的比例
注意:-Xms 等价于 -XX:InitialHeapSize //jvm初始堆内存 1/64
-Xmx 等价于 -XX:MaxHeapSize //jvm最大堆内存 1/4
-xss 等价于 -XX:TreadStackSize //堆栈的大小
2.查看JVM运行时参数
-XX:+PrintFlagsInitial //查看初始值
-XX:+PrintFlagsFinal //查看最终值
-XX:+UnlockExperimentslVMOptions //解锁实验参数
jps:撞门查看java进程
jinfo:查看正在运行jvm参数
例如:jinfo -flag MaxHeapSize pid
jinfo -flag UseG1GC pid
jinfo -flag UseConcMarkSweepGC pid
jinfo -flag UseParallelGC
3.jstat查看JVM统计信息
option:-class,-compiler,-gc,-printcompilation
-class: jstat -class 23029 1000 10
-gc: jstat -gc 23029
-gc输出的结果:
S0C、S1C、SOU、S1U:S0和S1的总量与使用量
EC、EU:Eden区总量与使用量
OC、OU:Old区总量与使用量
MC、MU:Metaspace区总量与使用量
CCSC、CCSU:压缩类空间总量与使用量
YGC、YGCT:YoungGC的次数与时间
FGC、FGCT:FullGC的次数与时间
GCT:总的GC时间
-compiler、-printcompilation:jstat -compiler 23029
4.演示内存溢出
5.如何导出内存映像文件
1.内存溢出自动导出(不建议使用)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
2.使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof XXX
6.MAT分析内存溢出
7.jstack与线程的状态
jstack XXXX
top XXX -p -H
线程状态图:
java线程状态:
NEW 、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
https://mp.weixin.qq.com/s/GsxeFM7QWuR--Kbpb7At2w
8.jstack实战死循环与死锁
三.基于JVisualVM的可视化监控
1.监控本地java进程
https://visualvm.github.io/pluginscenters.html
https://visualvm.github.io/documentation.html
2.监控远程的java进程
JAVA_OPTS="$JAVA_OPTS
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferIPv4Stack=true
-Djava.rmi.server.hostname=10.110.3.62"
四.基于Btrace的监控调试
五.Tomcat性能监控与调优
六.JVM层GC调优
七.JVM字节码与Java代码层调优