Java垃圾收集器和go当中的区别


垃圾回收算法主要分为三种:标记-清除,标记-复制和标记-整理。
其中,Java语言是基于分代的,在新生代主要使用了标记-复制,在新生代中分为eden,s0区和s1区。
其中,绝大多数对象都是直接在eden区进行分配,然后s0区和s1区空闲的区域进行复制工作。而老年代主要使用标记-整理算法,将标记后的对象统一移动到内存区域的前部分,然后对后面的区域进行清理。
而go当中主要使用了标记-清除算法,其主要原理是对对象进行标记,然后回收未被标记过的对象。具体的算法就不在此详述,本文想要探索的是java和go当中垃圾回收的不同点。

要想找到不同点,首先要找到相同点。即标记,三种算法均是基于标记算法产生的,不同地方在于对于标记后的行为的处理,但这其实并不是关键,因为不管是复制、整理还是清除,均是基于内存区域特点或语言特点决定的,如新生代常常大批量死亡,所以只需要复制存活对象,这样效率高,而老年代主要是大对象以及存活时间较长的对象,变化不大,因此进行整理,而go语言追求简单,因此使用清除。

因为有许多文章对这三种算法进行比较,因此本文就不再赘述,而本文要说的是Java和go当中标记的不同点。

标记过程中的主要问题:
1.断开引用
假设已经遍历到E(变为灰色了),此时应用执行了 objD.fieldE = null :

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值