Java 垃圾回收

近期,我学习了Java语言提供的垃圾回收机制,并在实验中针对自己的程序考虑自定义的高效的垃圾回收机制。现对Java GC(尤其是回收算法)进行简单总结。

Java内存回收由Java虚拟机完成。

1. 垃圾回收的对象

Java垃圾回收的对象很明确:没有引用指向的对象。对于这样的对象,JVM的一个系统级线程会自动删除它并释放该内存块,以便程序能够再次使用这块内存。

2. 垃圾回收的算法

垃圾回收算法的基础是必须能够区分哪些是live objects,哪些是dead objects。通常的垃圾回收算法完成这个区分的方法是:从根出发可达的对象是现阶段仍在使用的对象,即live objects;而不可达的对象就是dead objects,也就是垃圾回收的对象。

有了对live objects(可达对象)和dead objects(不可达对象)的区分后,垃圾回收的基本算法主要有四种。

1) 引用计数算法

引用计数算法的思想是:在每个对象中维护一个字段,这个字段用来统计它被使用的次数,即引用计数器。当有一个新的引用指向该对象时,该引用计数器就的值就会增加一 ,而当一个指向该对象的引用失效时该计数器就会减一。这样一直做下去,当某个对象的引用数量为零时,则说明对象没有被任何引用指向,成为垃圾回收的目标。
一般的引用计数算法没有利用到全局对象图的信息,因此也就无法处理“循环引用”情况的发生。改进后的引用计数算法引进了“弱引用”的思想来解决“循环引用”的问题,这里不再讨论。

2) 标记-清除算法

标记-清除算法分为“标记”和“清除”两个阶段。首先是“标记”阶段,这个阶段的完成依赖于live objects(可达对象)和dead objects(不可达对象)的区分。然后是清除阶段,这个阶段会将所有被标记为垃圾的对象统一进行回收。缺点:该算法可能会产生大量的内存碎片,当后面需要较大的连续内存时可能无法找到满足条件的内存块。

3) 标记压缩算法

标记压缩算法与标记-清除算法类似。标记过程与标记-清除算法完全相同,只是在第二阶段中,完成标记后并不直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

4) 复制算法

复制算法将内存按容量分为大小相等的两块,每次只使用其中的一块进行内存分配。垃圾回收的触发条件为:一块的内存用完了。这时就将存活的对象复制到另外一块上,刚刚使用过的这块内存就可以清理掉了。这个算法的优势在于解决了内存碎片的问题,缺点在于只使用其中的一半做内存分配。因此在使用中,内存区域的划分常常大小不等,也不一定只划分为两个区域。

需要特别注意的是,一个垃圾收集器中存在多种垃圾回收算法。另外,我们也可以根据自己的程序情况,自定义垃圾回收机制,以实现更高效的内存管理。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值