几种垃圾回收器的原理

标记-清除收集器

这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。

标记-压缩收集器

有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。

复制收集器

这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。

增量收集器

增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾,也可理解为把堆栈分成一小块一小块,每次仅对某一个块进行垃圾收集。这会造成较小的应用程序中断时间,使得用户一般不能觉察到垃圾收集器正在工作。


部分回收原理

通常80%~90%的新分配对象在几百万条指令之内或者再分配了。

分代收集器(Generational garbage coolection)

 它是基于拷贝回收器和部分回收原理。

充分利用大多数对象“英年早逝”的特性的有效方法。

将堆区分成一系列小的区域,用0,1,2......n对它们进行编号,序号越小的区域存放的对象越年轻,对象首先在0区域被创建,填满后垃圾被回收,可达对象被移到1区,每一轮垃圾回收都是针对序号小于等于i的区域进行的,i为当前被填满区域的最高编号。


只要对i进行回收,所有序号小雨i的区域也将要进行垃圾回收,应为较年轻的世代往往包含了较多的垃圾,也就是更频繁的被回收。

最老的世代保存了最成熟的对象,对这些对象的回收是最昂贵的,相当于一次完整的回收。可引起较长时间的停顿。解决方法是使用列车算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值