jvm GC标记算法

1. 引用计数器算法

 引用计数算法在每个对象都维护着一个内存字段来统计它被多少”部分”使用—引用计数器,每当有一个新的引用指向该对象时,引用计数器就+1 ,每当指向该引用对象失效时该计数器就-1 ,当引用数量为0的时候,则说明对象没有被任何引用指向,可以认定是”垃圾”对象.

2. 可达性分析算法

① 如何查看有哪些GC ROOTS节点

运行程序,并将程序阻塞, 通过jdk自带的visual VM 生成dump文件, 使用MAT查看有哪些gc roots节点

② GC ROOTS节点如何溯源? (查看gc 链)

通过jprofiler软件运行程序, 选择live memory

3. 清除算法

 ① 执行过程 :

当队中的有效内存空间被耗尽的时候. 就会停止整个世界, 然后进行两项工作, 第一项就是标记, 第二项就是清除

  • 标记  : Collector聪引用根节点开始遍历, 标记所有的被引用的对象, 一般是在对象的Header(对象头)中记录为可达对象
  • 清除 : Collector对堆内存从头到尾进行线性遍历, 如果发现某个对象在其Header中没有标记为可达对象, 则将其回收

② 缺点

  • 效率不算高 , 需要执行两次全局遍历,  第一个是遍历全局对象, 进行标记, 第二次是遍历全局对象进行清除
  • 在进行GC时候, 需要停止整个应用程序, 导致用户体验差
  • 这种方法清理出来的空闲内存是不连续的, 产生内存碎片需要维护一个空闲列表

③ : 何为清除?

这里所谓的清除, 并不是真的置空, 而是把需要清除的对象的地址保存在空闲的地址列表中, 下次有新对象需要加载时, 判断垃圾的位置空间是否够, 如果够, 就存放

举例说明 : 

test 1 : 

 从日志可以看出, 局部变量表的最大长度是2 , 但是只显示了一个this变量, 说明buffer变量已经被清除, 但是从垃圾日志可以看出, 对象进入了老年代, 说明对象的地址已经被保存到空闲列表中,

当从新声明一个变量value时, 空间被占用, 这才将之前的垃圾清除, 为新对象提供空间

4. 复制算法

 ① 定义

将内存空间分为两块, 每次只使用其中一块, 在垃圾回收时, 将正在使用的内存中存活对象复制到未被使用的内存块中, 之后清除正在使用的内存块中的所有对象, 交换两个内存的角色, 最后完成垃圾回收

② 优点

  • 没有标记和清除的过程, 实现简单, 运行高效
  • 复制过去以后保证空间的连续性, 不会出现"碎片"问题

③ 缺点

  • 此算法的缺点也是很明显, 就是需要两倍的内存空间
  • 对于G1这种拆成为大量的region的GC, 复制而不是移动, 意味着GC需要维护region之间的对象引用关系, 不管是内存占用或是时间开销也不小

④ 应用场景

如果系统中存活的对象很多, 复制算法需要复制的存活对象数量太大, 效率低下, 因此复制算法适用于清除那个生命周期短的对象

5. 标记整理算法

① 定义

标记-整理算法的最终效果等同于标记-清除算法执行完成后, 在进行一次内存碎片整理, 如此一来, jvm只需要维护一个内存的起始地址即可, 少维护了一个空闲列表

② 优点

  • 消除了标记-清除算法当中,内存区域分散的缺点, 我们需要给新对象分配内存时, jvm只需要持有一个内存的起始地址即可, 
  • 消除了复制算法当中, 内存减半的高额代价

③ 缺点

  • 从效率上来说, 标记-整理算法低于标记-清除算法
  • 移动对象的同时, 如果对象被其他对象引用, 则还需要调整引用的地址
  • 移动过程中, 需要全程暂停用户程序 : STW

6. 算法对比

7. 分代收集算法

年轻代 : 采用复制算法

老年代 : 采用标记清除或者标记整理算法

8.  增量收集算法

① 基本思想

如果一次性将所有的垃圾进行处理, 需要造成长时间的停顿, 那么就可以让垃圾收集线程和应用程序线程交替执行, 每次垃圾收集线程只收集一小块区域的内存空间, 接着切换到应用程序线程, 依次反复, 直到垃圾收集完成 .

总的来说, 增量收集算法的基础仍是传统的标记-清除和复制算法, 增量收集算法通过对线程间冲突妥善处理, 允许垃圾收集线程以分阶段的方式完成标记,清除或复制工作

② 缺点

使用这种方式, 由于在垃圾回收过程中, 间断性地还执行了应用程序代码, 所以能减少系统的停顿时间, 但是, 因为线程切换和上下文转换的消耗, 会使得垃圾回收的总体成本上升, 造成系统吞吐量的下降

9. 分区算法

 一般来说, 在相同条件下, 堆空间越大, 一次GC时所需要的时间就越长, 有关GC产生的停顿也越长,为了更好地控制GC产生的停顿时间, 将一块大的内存区域分割成多个小块, 根据目标的停顿时间, 每次合理地回收若干个小区间,而不是整个堆空间, 从而减少一次GC所产生的停顿

分代算法将对象按照生命周期长短划分成两个部分, 分区算法将整个堆空间划分成连续的不同小区间

每一个小区间都独立使用, 独立回收, 这种算法的好处是可以控制一次回收多少个小区间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值