02. 基于JDK命令行工具的监控

JVM与调优 imooc JVM Markdown

JVM参数类型

  • 标准参数

-help
-server -client
-version -showversion
-cp -classpath

  • 标准参数 非标准化参数,在JVM版本之间有可能变化,变化不大。

-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码

  • XX参数: 非标准化参数、相对不稳定、主要用于JVM调优和Debug
    Boolean类型

格式: -XX:[+-] 表示启用或者禁用name属性
比如: -XX:+UseConcMarkSweepGC、-XX:+UseG1GC

非Boolean类型:

格式: -XX:= 表示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的内存结构

image.png

非堆区: 是操作系统的本地内存,独立于JVM之外的。在JDK1.8,非堆区变成了Metaspace。JDK1.7 为PermGen。Metaspace包括CCS、CodeCache(Java代码转为native,JIT编译)

  • JIT编译

-compiler
-printcompilation

jmap+MAT实战内存溢出

导出内存映像文件的两种方式:

  1. 内存溢出自动导出

-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./

  1. 使用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

你可能感兴趣的:(02. 基于JDK命令行工具的监控)