Java与垃圾回收技术类型的学习思考

Java垃圾回收详解
本文深入探讨Java垃圾回收机制,解析对象可能不被回收的原因、垃圾回收与内存的关系,并对比引用计数、停止-复制及标记-清扫等不同垃圾回收技术的特点。
Java垃圾回收牢记3要点:


 1. 对象可能不被垃圾回收。
 2. 垃圾回收并不等于“析构”。
 3. 垃圾回收只与内存有关。
 
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。


垃圾回收器与Java堆的关系:


 1. 在某些Java虚拟机中,堆的实现像传送带一样(并不完全),每分配一个新对象,它就往前移动一格;
 2. 而在内存即将耗尽时,由于垃圾回收器的介入:它一面回收,一面使堆中的对象紧凑排列,使得“堆指针”就可以更容易移动到更靠近传送带的开始处,避免页面错误。




垃圾回收机制:
1.引用计数:简单但速度很慢
内容:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。垃圾回收器在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占有空间。
分析:管理引用的开销在整个程序生命周期中将持续发生。且如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数不为0”的情况。








更快的垃圾回收技术:


 1. 思想:
对任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有引用,就能找到所有“活的”对象。并且,对于每一个引用,必须追踪它所引用的对象,然后是此对象所包含的所有引用,如此反复进行,指导”根源于堆栈和静态存储区的引用“所形成的网络全部被访问为止。
 2.方法技术:自适应的垃圾回收技术。如何找到的存活对象,取决于不同的Java虚拟机的实现。


做法:


 1.停止-复制:先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。
 ①当对象被复制到新堆时,他们是一个挨着一个的,所以新堆紧凑排列;
 ②当把对象从一处搬到另一处时,所有指向它的那些引用都必须修正。
 ③效率低。首先要有两个堆,然后在这两个堆之间来回倒腾,从而维护比实际需要多一倍的空间。(所以,某些Java虚拟机按需从堆中分配几块较大的内存,复制动作发生在这些大块内存之间)
 ④程序进入稳定状态后,可能只产生少量或不产生垃圾,尽管如此,复制式回收器仍然会将所有内存自一处复制到另一处。
 2. 标记-清扫:堆栈和静态存储区出发,遍历所有引用,进而找出所有存活的对象。每当他找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成后,清理动作才会开始。不会发生复制动作,所以剩下的堆空间是不连续的。






 


 
综述
    还有,给块以相应的代数来记录它是否还存活。通常,如果块在某处被引用时,其代数会增加;这对处理大量短命的临时对象很有帮助。
    自适应技术:对象稳定,垃圾回收器的效率较低的化,就切换到“标记-清扫”方法;如果堆空间出现很多碎片,就会切换回“停止-复制”方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值