垃圾回收算法
1.引用计数法
image.png2.复制算法 (新生代)
image.pngimage.png复制活的到空的(复 活)
复制之后有交换,谁空谁是To (To 0 --->往占用0的位置挪)
优点:没有产生内存碎片, 缺点:大对象复制耗时(所以用于新生代)
3.标记清除法 (老年代)
image.png4.标记整理法 (老年代)
image.png image.png tGC Roots 一定是从Roots开始的
可以作为GC Root的对象
image.png image.png盘点家底查看 JVM 默认值
- 查看初始默认值:-XX:+PrintFlagsInitial
ginseng@ginseng-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 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
...
- 查看修改更新:-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 加载时改变的参数
工作中常用的 JVM 配置参数
image.png永久代用的是JVM的堆内存
通过-XX:+PrintGCDetails查看GC收集日志
image.png image.png image.png image.png image.png image.png
该参数范围只能设置0~15(java8)
引用
image.png强引用
软引用
弱引用
软/弱引用使用场景
虚引用
GC Roots和四大引用总结
image.pngOOM(常见)
image.png image.pngGC Overhead
image.pngDirect buffer memory
image.png通常因为NIO导致
unable to create new native thread
image.pngMetaspace
image.pngGC 收集器
image.pngimage.png其中,G1收集器是将堆内存分割成不同的区域然后并发的对其进行垃圾回收.
image.png image.pngjava8
新生代收集器
image.png image.png image.png image.png image.png image.png老年代收集器
image.png image.pngCMS4步过程
image.png
1.初始标记
image.png
2.并发标记
3.重新标记
image.png
4.并发清除
image.png四步总结
image.png
CMS优缺点:
优:并发收集低停顿
缺:1.采用标记清除算法会导致大量内存碎片
2.并发执行对CPU压力大
image.png
缺点主要原因
如何选择垃圾收集器
image.pngG1收集器
image.png image.png image.png image.png特点
image.png
G1底层原理
image.png image.png image.png image.png image.png回收步骤
image.png image.png
四步
image.png
网友评论