Java - gc

简述gc

 

 

GC:垃圾回收(Garbage Collection),程序员无需手动管理内存,由虚拟机来自动管理内存。垃圾回收的工作原理很简单,以应用程序的Root为基础,遍历应用程序在 Heap上动态分配的对象,识别这些对象是否被引用,如果没有被引用,可认为是死亡的对象,即垃圾,就可以回收这块内存。需要说明的是,垃圾回收并不是实 时进行的,很好理解,实时地回收垃圾效率很低。举例来说,我们在生活中也是在垃圾多到一定程度再去处理,完全没有必要有一点垃圾就去处理。因此,GC会在 CLR认为需要的时候运行。当然,我们也可以调用System.GC.Collection(),显式的进行垃圾回收,这种场合很少使用,需要说明的是, 即使显式的进行垃圾回收,也不能保证所有未引用的对象被清除掉。

GC 算法:目前常用的GC算法有Reference Counting、Mark Sweep、Copy Collection。

Reference Counting:引用计数,该算法记录对象被引用的次数,增加一个引用加1,删除一个引用减1,当引用的次数为0时,即可认为该对象是垃圾。该算法致命 的缺点是,不能处理循环引用的情况。举例来说,A 引用B,B引用C、C引用A,但是A、B、C都是死亡的对象,不会再被使用。引用计数不能处理这种情况。

Mark Sweep:标记清除,目前主流的虚拟系统.net CLR、Java VM、Rotor 都是采用Mark Sweep 算法,该算法分为两步,第一步从应用程序的根节点开始,标记所有被引用的对象,第二步,遍历Heap,清除没有被标记的对象。该算法的缺点是,需要暂停应 用程序,并且会产生碎片。

Copy Collection:拷贝集合,该算法将内存空间分为相等的两块,每次只使用其中的一块。垃圾回收时,遍历当前使用的一块,把正在使用的对象Copy到 另一块,此算法只是Copy正在使用的对象,因此Copy成本比较低,Copy的过程中进行内存整理,因此不会产生碎片。该算法的缺点很明显:需要两倍大 的内存空间。

Mark Compact:标记整理,该算法结合了Mark Sweep 和 Copy Collection 的优点,也分两步进行:第一步,从应用程序的根节点开始,标记所有被引用的对象,第二步,遍历Heap,清除未被标记的对象,并把标记的对象压缩在一起, 按顺序排放。这种算法解决了碎片问题和需要两倍大的空间问题。

 

转载于:http://nzbbody.blog.163.com/blog/static/511610622011111323618362/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值