2. 对象存活判断和垃圾回收机制

判断对象是否存活

引用计数算法

算法思路
  • 给对象中添加一个计数器, 如果有一个地方引用, 计数器 +1, 引用失效 -1
  • 当计数器为0 时说明对象没有地方子引用, 既可以判定这个对象已经消亡
缺点

不能解决对象间相互循环引用的问题 对象A = 对象B 对象B = 对象A

可达性分析算法

通过一系列的 GC Roots 的对象作为起始点, 根据 根搜索算法(GC Roots Tracing)判断对象是否存活

算法思路
  • 从GC Roots节点开始向下搜索, 搜索所走的路径称为引用链,当一个对象到GC Roots没有任何引用链相连接时, 则证明此对象是不可用的
可以作为GC Roots 的对象
  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象

垃圾回收机制算法

标记-清除算法

首先标记出来需要回收的对象, 在标记完之后统一进行回收

缺点
  • 效率不高,标记和清除都不是一个效率高的操作
  • 空间问题, 大量的不连续的空间内存碎片, 会导致之后分配大对象的内存时, 无法找到连续的可分配空间,提前触发一次GC

复制算法

复制算法主要应用在新生代中,以新生代为例:

  • 将内存分为多块,Eden区和两份大小相同的survive区,先使用 Eden 区
  • 第一次发生Minor Gc的时候,将Eden存活的对象放入其中一块survive区中,这时候该survive区叫做名义上的 From-survive区,另一块叫做 To-survive区
  • 第二次发生Minor Gc的时候,将Eden区和From-survive区存活的对象复制到To-survive区,然后To变为From,From 变为To
优点

减少空间碎片化

缺点

存活率高的时候需要操作复制对象的就会很多, 效率很低

标记-整理算法

让所有的存活对象向一边移动, 然后清理掉边界外的内存

分代收集算法

  • 新生代使用复制算法较多
  • 老年代使用标记-整理算法较多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值