JVM与调优
imooc
JVM
Markdown
JVM参数类型
- 标准参数
-help
-server -client
-version -showversion
-cp -classpath
- 标准参数 非标准化参数,在JVM版本之间有可能变化,变化不大。
-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
-
XX参数: 非标准化参数、相对不稳定、主要用于JVM调优和Debug
Boolean类型 :
格式: -XX:[+-] <name>表示启用或者禁用name属性
比如: -XX:+UseConcMarkSweepGC、-XX:+UseG1GC
非Boolean类型:
格式: -XX:<name>=<value> 表示name属性的值是value
比如: -XX:MaxGCPauseMillis=500、-XX:GCTimeRatio=19
举例参数:
-Xmx -Xms -xss : 是XX参数
-Xms 等价于-XX:InitialHeapSize
-Xmx 等价于-XX:MaxHeapSize
-Xss 等价于-XX:ThreadStackSize
查看JVM运行时参数
- -XX:+PrintFlagsInitial
- -XX:+PrintFlagsFinal
- -XX:+UnlockExperimentalVMOptions: 解锁实验参数
- -XX:+UnlockDiagnosticVMOptions: 解锁诊断参数
- -XX:+PrintCommandLineFlags: 打印命令行参数
查看方式:
java -XX:+PrintFlagsFinal -version
tips: = 表示默认值;:=被用户或者JVM修改后的值
如何查看已经运行的JVM进程对应的参数内容:
使用jinfo可以查看, -flag 参数名 pid
查看最大内存
jinfo -flag MaxHeapSize 23678
查看垃圾回收器
jinfo -flag UseConcMarkSweepGC 3176
jinfo -flag UseG1GC 3176
jinfo -flag UseParallelGC 3176
jstat查看JVM统计信息
- 类装载: 可以查看类的加载信息。
jstat -class 8167 1000 10
上述命令就可以查询对应的8167进程的类加载信息,1000为间隔毫秒数,10为打印次数。
- 垃圾收集: 查看GC相关的信息
主要使用如下参数查看
-gc
-gccapacity
-gcutil
-gccause
-gcnew
-gcold
-gc 输出结果参数详解:
S0C、S1C、S0U、S1U: S0和S1的总量与使用量
EC、EU: Eden区总量与使用量
OC、OU: Old区总量与使用量
MC、MU: Metaspace区总量与使用量
CCSC、CCSU: 压缩类空间总量与使用量
YGC、YGCT: YoungGC的次数与时间
FGC、FGCT:FullGC的次数与时间
GCT: 总的GC时间
tips:
Eden区 + S0区+ S1区 = Young区
Young区 + Old区 = JVM堆区
S0区 大小 = S1区 大小,且同时只有一个使用,另一个空置
tips: JVM的内存结构
非堆区: 是操作系统的本地内存,独立于JVM之外的。在JDK1.8,非堆区变成了Metaspace。JDK1.7 为PermGen。Metaspace包括CCS、CodeCache(Java代码转为native,JIT编译)
- JIT编译
-compiler
-printcompilation
jmap+MAT实战内存溢出
导出内存映像文件的两种方式:
- 内存溢出自动导出
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
- 使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof pid
jstack与线程的状态
Java线程的状态
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED
查询CPU飙高排查命令:
top -p pid -H (查看某个进程内部线程占用情况)
jstack pid
printf "%x" 十进制的线程id
网友评论