Java heap-based GC的四种基本方式

1.Reference counting(引用计数)

基本思想:为每一个object存储一个计数RC,每当有一个refere指向它时,RC++;当一个reference断开与它的链接的时候,RC--;如果RC == 0,则回收它.


计数回收的优点:

1).实现简单

2).计算代价分散

3).幽灵时间短

计数回收的缺点:

1).不全面,容易漏掉循环引用的对象

2).并发支持较弱

3).占用额外的内存空间

2.Mark-Sweep(标记清除)

思想:为每个对象设置状态位(live/dead)并记录,即mark阶段;将标记为dead的对象进行检测,即sweep阶段


标记清除的优点:

1)全面的:循环的收集垃圾

2)指针操作没有运行时间开销

3)不移动对象

标记清除的缺点:

1)Stop/start 导致暂停以及较长的僵尸时间

2)内存中的每个位置都必须在该算法的扫描阶段进行检查,而这可能非常耗时且复杂度为O(heap)而不是O(live)

3)空间碎片:当对象被清除时,会在使用过的内存中留下几个空白.这种碎片对于需要大量内存的应用程序会造成严重的性能问题。


3.Mark-Compact(标记整理)

思想:对对象进行标记,清理到死掉的对象,将所有活着的对象移动到最后.



标记整理的优点:

1)采用该算法可以解决标记清除产生的空间碎片问题

2)内存中对象的相对顺序保持不变 - 也就是说,如果对象X在GC之前具有比Y更高的内存地址,则它之后仍然具有更高的地址。 

这个属性对于像数组这样的特定数据结构很重要。

标记整理的缺点:

它比Mark-Sweep采集需要更多的时间,这会严重影响性能。

4.Fragmentation and Copying(复制)

思想:将空间分成两个部分,分别叫做from和to,每次GC,将所有的活着的对象从from区copy到to区域,之后from变为to,to变为from.

复制GC的优点:

1)GC后数据更加紧凑

2)所有对象的大小分配代价很小

3)空间开销固定

4)全面的:循环的尽心垃圾回收

5)实现简单

复制GC的缺点:

1)stop-and-copy可能造成严重的后果

2)需要的空间更大

3)长时间存活的对象可能被重复的copy

4)所有的引用必须重新更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值