1、JVM 垃圾回收的时候如何确定垃圾?
2、知道什么是 GC Roots 吗?
3、如何盘点查看 JVM 系统默认值?
4、你平时工作用过的 JVM 常用的基本配置参数有哪些?
1、什么是垃圾
简单来说就是内存中已经不在被使用到的空间就是垃圾
2、要进行垃圾回收,如何判断一个对象是否可以被回收?
引用计数法
枚举根节点做可达性分析(根搜索路径 GC Roots)
为了解决引用计数法的循环引用问题,Java 使用了可达性算法。
跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一系列名为GC Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC Roots 没有任何引用链时,则证明此对象是不可用的。也即给定一个集合的引用作为根出发点,通过引用关系遍历。
哪些对象可以作为 GC Roots 的对象:
JVM 的参数类型
标配参数
X 参数(了解)
XX 参数
Boolean 类型:-XX:+ 或者 - 某个属性值(+ 表示开启,- 表示关闭)
-XX:+PrintGCDetails:打印 GC 收集细节
-XX:-UseSerialGC:不使用了串行收集器
-XX:+UseSerialGC:使用了串行收集器
-XX:-PrintGCDetails:不打印 GC 收集细节
KV 设置类型:-XX:key=value
-XX:MetaspaceSize=128m
-XX:MaxTenuringThreshold=15
盘点家底查看 JVM 默认值
查看初始默认值:-XX:+PrintFlagsInitial
cuzz@cuzz-pc:~/Project/demo$ java -XX:+PrintFlagsInitial
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50
......
查看修改更新:-XX:+PrintFlagsFinal
bool UsePSAdaptiveSurvivorSizePolicy = true {product}
bool UseParNewGC = false {product}
bool UseParallelGC := true {product}
bool UseParallelOldGC = true {product}
bool UsePerfData = true {product}
bool UsePopCountInstruction = true {product}
bool UseRDPCForConstantTableBase = false {C2 product}
= 与 := 的区别是,一个是默认,一个是人为改变或者 jvm 加载时改变的参数
打印命令行参数(可以看默认垃圾回收器):-XX:+PrintCommandLineFlags
cuzz@cuzz-pc:~/Project/demo$ java -XX:+PrintCommandLineFlags
-XX:InitialHeapSize=128789376
-XX:MaxHeapSize=2060630016
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseParallelGC
-Xms
初始大小内存,默认为物理内存 1/64
等价于 -XX:InitialHeapSize
-Xmx
最大分配内存,默认为物理内存的 1/4
等价于 -XX:MaxHeapSize
-Xss
设置单个线程栈的大小,一般默认为 512-1024k
等价于 -XX:ThreadStackSize
-Xmn
设置年轻代的大小
整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小,持久代一般固定大小为64m,所以增大年轻代后,将会减小年 老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:MetaspaceSize
设置元空间大小(元空间的本质和永久代类似,都是对 JVM 规范中的方法区的实现,不过元空间于永久代之间最大区别在于,元空间并不在虚拟中,而是使用本地内存,因此默认情况下,元空间的大小仅受本地内存限制)
元空间默认比较小,我们可以调大一点
-XX:+PrintGCDetails
输出详细 GC 收集日志信息
设置 JVM 参数为: -Xms10m -Xmx10m -XX:+PrintGCDetails
-XX:SurvivorRatio
设置新生代中 eden 和 S0/S1 空间比例
默认 -XX:SurvivorRatio=8,Eden : S0 : S1 = 8 : 1 : 1
-XX:NewRatio
配置年轻代和老年代在堆结构的占比
默认 -XX:NewRatio=2 新生代占1,老年代占2,年轻代占整个堆的 1/3
-XX:MaxTenuringThreshold(值规定在0-15)
设置垃圾最大年龄(年轻代经过15次——老年代)
每日一言:
不要让未来的你,讨厌现在的自己。