进阶学习(4.3) JVM 垃圾回收算法

1, 引用计数法

  • Object  a = new Object(),  引用计数为0
  • Object  b =  a;   计数 +1
  • a = null  计数为0,  对象将被回收
  • b 也是垃圾对象

引用计数法有很大的缺点, 无法解决循环引用, a  = c ; b = a; c = b;

java 中的对象引用是非常频繁的, 会操作频繁的计数, 消耗性能

 

2, 标记清除法

  • 必须先知道GC Root 是什么, 可以参考我写的另一篇博客 https://blog.csdn.net/weixin_42209307/article/details/108457077
  • JVM 从堆中的 root 对象开始寻找,  Root 是有很多个的, 将与 root  对象关联的对象全部进行标记, 然后JVM 会将没有被标记的对象抹除

进阶学习(4.3) JVM 垃圾回收算法_第1张图片

  • 抹除的时候,  堆中就会出现很多空白的内存,  断断续续的, 内存不连续, 这个是标记清除法的缺点

进阶学习(4.3) JVM 垃圾回收算法_第2张图片

  • 而且在标记的时候, 程序会中止进行, 全部处于wait 状态, 这是为了防止新创建的对象, 关联对象没有标记, 而被虚拟机清除,  这个过程叫, "stop the world", 我们简称STW 就好了, 所有垃圾回收机制在清除的时候都会产生STW

 

3,  标记压缩算法

  • 就是为了解决标记算法内存不连续的问题
  • 为什么向前排, 方便创建对象的时候使用指针碰撞快速找到可分配内存

进阶学习(4.3) JVM 垃圾回收算法_第3张图片

 

4, 复制算法

  • 复制算法开辟了两块空间, Java er 必须要知道的就是, 新生代的幸存区就是采用的复制算法, 从 from 到 to
  • 还是要先标记,  再 A 空间操作标记, 然后将未标记的对象留在A, 被标记的对象移动到B, 再清除 A 整块空间
  • 这里了解一下JVM的幸存区, 幸存区永远都是在操作A区, GC操作完以后, 移形换位了, B 变成了 A

进阶学习(4.3) JVM 垃圾回收算法_第4张图片

 

5,  分代算法

  • 分代算法非算法,  也可以叫它为组合算法,  针对, 幸存区 和 老年代, 进行上面不同的算法, 
  • 幸存区是复制算法,  老年代是标记算法

 

6, 分区算法, jdk 1.7 以后, G1 GC 使用分区算法

  • 分区算法, 网上说的都是, 上面减少STW时间, 至于为什么减少, 只字不提,  我TM, 
  • 分区算法是为了适配G1 回收器的, 目的旨在, 并发的进行垃圾回收, 将STW产生下发到某一个区块
  • 垃圾为什么要控制堆不能产生新对象, 因为新对象可能会被未标记, 导致变成垃圾
  • 而分区算法就好像,  以前的堆是单线程, 现在变成多线程了,  以前我需要控制整个堆不产生新对象
  • 而现在我在GC的时候, 只需要控制某个小块空间不产生新对对象就好了

进阶学习(4.3) JVM 垃圾回收算法_第5张图片

你可能感兴趣的:(JVM,学习资料,JAVA,jvm)