jvm学习路线

What

How

JVM的参数

JVM的参数类型分类

共三类:

  • 标准参数 (-h -help -server -client -version -showversion -cp -classpath -Dkey=value)
  • X参数
    • 使用java -X可查看,如-Xint解释执行 -Xcomp 编译执行 -Xmixed :混合模式,JVM自己来决定是否编译成本地代码
  • XX参数
    • 相对不稳定
    • 主要用于jvm调优和debug
    • boolean类型 -XX:[+-]name表示启用或禁用name属性,如-XX:+UseConcMarkSweepGC -XX:+UseG1GC
    • 非boolean类型 -XX:name=value表示name属性的值是value,如-XX:GCTimeRatio=19 -XX:MaxGCPauseMillis=500

特殊:

  • -Xmx-Xms-Xss不是X参数,而是XX参数,分别等价于-XX:InitialHeapSize -XXMaxHeapSize -XX:ThreadStackSize
$> java -X
...
The -X options are non-standard and subject to change without notice.(-X 选项是非标准选项, 如有更改, 恕不另行通知。)
  • java -version
  • java -Xint -version
  • java -Xcomp -version
  • java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

查看JVM运行时参数

https://docs.oracle.com/javase/8/docs/technotes/tools/index.html

PID=xxx

java -XX:+PrintFlagsInitial
java -XX:+PrintFlagsFinal
java -XX:+PrintCommandLineFlags -version

jps -lvVm
jinfo -flag MaxHeapSize $PID
jinfo -flag InitialHeapSize $PID
jinfo -flag ThreadStackSize $PID
jinfo -flag UseG1GC $PID

jdk自带工具

jps/jstat/jmap/jstack/jdb/javap

jstack与线程的状态

jstack实战死循环与死锁

jstat查看JVM统计信息

平时生产上比较常用的主要是gc/gcutil

jstat -help
jstat -options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

jstat -class $PID

root@f1aeb6857b53:/# jstat -class 1
Loaded  Bytes  Unloaded  Bytes     Time
17677 32319.9        0     0.0      13.75
名称 说明 备注
Loaded 已经装载的类的数量
Bytes 装载类所占用的字节数
Unloaded 已经卸载类的数量
Bytes 卸载类的字节数
Time 装载和卸载类所花费的时间
  • jstat -compiler $PID
  • jstat -gccapacity $PID
root@f1aeb6857b53:/# jstat -gccapacity 1
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
     0.0 262144.0 164864.0    0.0 9216.0 155648.0        0.0   262144.0    97280.0    97280.0      0.0 1136640.0  99180.0      0.0 1048576.0  12696.0     31     0
  • jstat -gcutil $PID 1000 3(每秒查看一次,共3次)
root@f1aeb6857b53:/# jstat  -gcutil 1 1000 3
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00 100.00  88.08  61.24  95.52  93.79     29    0.653     0    0.000    0.653
  0.00 100.00  88.08  61.24  95.52  93.79     29    0.653     0    0.000    0.653
  0.00 100.00  88.08  61.24  95.52  93.79     29    0.653     0    0.000    0.653
  • jstat -gc $PID 1000 3 (每秒查看一次,共3次)
root@f1aeb6857b53:/# jstat -gc 1 1000 3
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   10240.0  0.0   10240.0 154624.0 137216.0  97280.0    59575.5   97900.0 93512.0 12696.0 11907.2     29    0.653   0      0.000    0.653
 0.0   10240.0  0.0   10240.0 154624.0 137216.0  97280.0    59575.5   97900.0 93512.0 12696.0 11907.2     29    0.653   0      0.000    0.653
 0.0   10240.0  0.0   10240.0 154624.0 137216.0  97280.0    59575.5   97900.0 93512.0 12696.0 11907.2     29    0.653   0      0.000    0.653
名称 说明 备注
S0C S1C S0U S1U S0和S1区的总量与使用量
EC EU Eden区的总量与使用量
OC OU Old区的总量与使用量
MC MU Metaspace区的总量与使用量
CCSC CCSU 压缩类空间的总量与使用量
YGC YGCT Young GC次数与时间
FGC FGCT Full GC次数与时间
GCT GC总时间
  • jstat -printcompilation $PID

演示内存溢出

private List<String>  userList = new ArrayList<String>();
/**
 * -Xmx32M -Xms32M
 **/
@GetMapping("/heap")
public String heap() {
    while(true) {
        userList.add(UUID.randomUUID().toString());
    }
}
/**
 * -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
 **/
@GetMapping("/nonheap")
public String nonheap() {
    while(true) {
        classList.addAll(Metaspace.createClasses());
    }
}

导出内存映像文件 && MAT分析内存溢出

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

  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/workbench/eblog/
  • jmap -dump:format=b,file=./a.dump 1

监控远程的java进程

btrace入门

依赖 jdk6特性instrument

arthas

http://doc2.valuetodays.cn/project-3/doc-30/

具体问题

  • 生产环境内存溢出该怎么处理?
    导出内存文件,DumpOnError,jmap
  • 生产环境服务器分配多少内存合适?
  • 如何对垃圾回收器进行调优?
  • 生产环境CPU负载飙高该如何处理?
  • 生产环境应该给应用分配多少线程合适?
  • 不使用log如何确定请求是否执行了某一行代码?
  • 不使用log如何实时查看某个方法的入参与返回值?
  • jvm的字节码是什么东西?
  • 循环体内做字符串+拼接为什么效率低?

杂项

JVM的内存结构

常见的垃圾回收算法

垃圾收集器

并行:Parallel,指多条垃圾收集线程同时执行,此时用户线程仍然暂停 吞吐量
并发:Concurrent,用户线程与垃圾收集线程同时执行 停顿时间
停顿时间:垃圾收集器收集的时间 -XX:MaxGCPauseMillis
吞吐量: 垃圾收集的时间/应用总时间 -XX:GCTimeRatio=n,垃圾收集时间占1/(1+n)

GC日志格式详解

可视化工具分析GC日志

ParallelGC调优

G1调优

作者:张三  创建时间:2022-04-20 21:40
最后编辑:张三  更新时间:2022-04-21 20:10