1)JVM 体系概述
JVM 体系结构概览
JVM 参数调优及相关参数
JVM 的参数类型
标配参数: java-version; java -help
X 参数:-Xint 解释执行; -Xcomp 第一次使用就编译; -Xmixed 混合模式(先编译再执行)
XX 参数:
Boolean 类型:-XX:(+|-)属性
+ 或者 - 某个属性值; + 表示开启; - 表示关闭
eg: -XX:+PrintGCDetails
kv 设值类型:-XX:key=value
说明: 键值对赋值
eg: -XX:MetaspaceSize=128m; -XX:MaxTenuringThreshold=15
两个经典参数:-Xms 和 -Xmx
-Xms: 等价于 - XX:InitialHeapSize
-Xmx: 等价于 - XX:MaxHeapSize
如果查看一个正在运行的 java 程序, 是否开启 jvm 参数是否开启? 具体值是多少?
jps -l
jinfo -flag PrintGCDetails 进程编号
jinfo -flag MetaspaceSize 进程编号
jinfo -flags 进程编号(所有配置: JVM 配置 + 命令行中人工配置)
-XX:+PrintFlagsInitialJVM 默认值
主要查看初始默认
eg: java -XX:+PrintFlagsInitial
符号:= 初始未更新过的值;=: 由人为或 JVM 修改的值
-XX:+PrintFlagsFinal
主要查看修改更新的内容
- eg: java +PrintFlagsFinal -version
- -XX:+PrintCommandLineFlags
运行 java 命令的同时打印出参数
eg: java -XX:+PrintCommandLineFlags -version
JVM 常用的基本参数
-Xms:
初始大小内存, 默认谓物理内存的 1/64
等价于:-XX:InitialHeapSize
-Xmx:
最大分配内存, 默认谓物理内存的 1/4
等价于:-XX:MaxHeapSize
-Xss:
设置单个线程栈的大小, 一般默认为 512k ~ 1024k
等价于:-XX:ThreadStackSize
-Xmn:
设置年轻化大小
-XX:MetaspaceSize
设置元空间大小: 元空间的本质和永久代类似, 都是对 JVM 规范中方法区的实现. 不过元空间与永久代之间最大的区别在于, 元空间并不在虚拟仙中, 而是使用本地内存. 因此默认情况下, 元空间的大小仅受本地内存限制
- -Xms 10m -Xmx 10m -XX:MetaspaceSize=1024M -XX:+PrintFlagsFinal
- -XX:+PrintGCDetails
输出 GC 的详细收集日志信息
GC
FULL GC
-XX:SurvivorRatio
设置新生代中 eden 和 s0/s1 空间的比例, SurvivorRatio 值就是设置 eden 区的比例占多少, s0/s1 相同, 使用 java -XX:+PrintGCDetails 查看
默认:-XX:SurvivorRatio=8, Eden:s0:s1=8:1:1
假如:-XX:SurvivorRatio=4, 则 Eden:s0:s1=4:1:1
-XX:NewRatio
配置年轻代与老年代在堆结构的占比, NewRatio 值就是设置老年代的占比, 剩下的 1 给新生代, 使用 java -XX:+PrintGCDetails 查看
默认:-XX:NewRatio=2 新生代占 1, 老年代占 2, 年轻代占整个堆的 1/3
假如:-XX:NewRatio=4 新生化占 1, 老年化占 4, 年轻代占整个堆的 1/5
-XX:MaxTenuringThreshold
设置垃圾的最大年龄: 即新生代经过多少次 GC 才进入老年代
另外一张图参考:
2) Java8 以后的 JVM
3)GC 作用域
4)常见的垃圾回收算法
引用计数
复制
标记清除
标记整理
识别某个对象是否是可回收的两种方法
引用计数法
枚举根节点做可达性分析(根搜索路径)
GC roots 或是 tacking GC 的 "根集合" 就是一组必须活跃的引用
基本思路: 通过一系列名为 "GC Roots" 的对象作为起始点, 从这个被称为 GC Roots 的对象开始向下搜索, 如果一个对象到 GC Roots 没有任何引用链相连时, 则说明此对象不可用. 也即给定一个集合的引用作为根出发, 通过引用关系遍历对象图, 能被遍历到的 (可到达的) 对象就被判定为存活; 没有被遍历到的就自然被判定为死亡.
GC Roots 对象
虚拟机栈 (栈帧中的局部变量区, 也叫做局部变量表) 中引用的对象.
方法区中的类静态属性中引用的对象.
方法区中常量引用的对象.
本地方法栈中 JNI(Native 方法)引用的对象.
Full GC
什么时候会发生 FullGC
Java 面试总结之 Full GC
从实际案例聊聊 Java 应用的 GC 优化
来源: https://www.cnblogs.com/Terry-Wu/p/12575770.html