java
标准化、规范化
java代码风格
【目录】java
编程-java8
编程-java9
编程-java-见过的异常
gradle
编程-java21
编程-java23
编程-java17
编程-java11
【目录】java-web-其它框架
java-vertx
quarkus
javalin
solon
Helidon
【目录】spring家族
spring
springcloud + nacos
consul
springboot启动流程
springboot使用及原理
springcloud
优化springboot
【java高级】
java-多线程-问题记录
java高级-ArrayList
java高级-HashMap
jdk源码解析-TreeMap红黑树
java对象占用多少字节
juc(并发)
ThreadPoolExecutor中ctl变量的理解
ThreadPoolExecutor分析
JVM(java虚拟机)
jvm学习路线
jvm
Java启动参数
debug
java-debug-arthas
java-debug-jdb
高并发/高性能/高可用
设计代码或编写代码时应该考虑的
如何发现系统中的瓶颈?
场景分析
mysql
mysql explain
mysql主从
mysql常见异常
方法论
工作中遇到的问题记录
代码优化
学习的思路
产品
本文档使用 MrDoc 发布
-
+
首页
jvm学习路线
# 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 ```shell $> 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> ```bash 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` ```shell jstat -help jstat -options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] ``` jstat -class $PID ```text 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 ```text 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次) ```text 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次) ```text 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 ## 演示内存溢出 ```java private List<String> userList = new ArrayList<String>(); /** * -Xmx32M -Xms32M **/ @GetMapping("/heap") public String heap() { while(true) { userList.add(UUID.randomUUID().toString()); } } ``` ```java /** * -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年4月21日 20:10
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
eblog
Markdown文件
分享
链接
类型
密码
更新密码