Java垃圾回收牢记3要点:
1. 对象可能不被垃圾回收。
2. 垃圾回收并不等于“析构”。
3. 垃圾回收只与内存有关。
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。
垃圾回收器与Java堆的关系:
1. 在某些Java虚拟机中,堆的实现像传送带一样(并不完全),每分配一个新对象,它就往前移动一格;
2. 而在内存即将耗尽时,由于垃圾回收器的介入:它一面回收,一面使堆中的对象紧凑排列,使得“堆指针”就可以更容易移动到更靠近传送带的开始处,避免页面错误。
垃圾回收机制:
1.引用计数:简单但速度很慢
内容:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。垃圾回收器在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占有空间。
分析:管理引用的开销在整个程序生命周期中将持续发生。且如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数不为0”的情况。
更快的垃圾回收技术:
1. 思想:对任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有引用,就能找到所有“活的”对象。并且,对于每一个引用,必须追踪它所引用的对象,然后是此对象所包含的所有引用,如此反复进行,指导”根源于堆栈和静态存储区的引用“所形成的网络全部被访问为止。
2.方法技术:自适应的垃圾回收技术。如何找到的存活对象,取决于不同的Java虚拟机的实现。
做法:
1.停止-复制:先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。
①当对象被复制到新堆时,他们是一个挨着一个的,所以新堆紧凑排列;
②当把对象从一处搬到另一处时,所有指向它的那些引用都必须修正。
③效率低。首先要有两个堆,然后在这两个堆之间来回倒腾,从而维护比实际需要多一倍的空间。(所以,某些Java虚拟机按需从堆中分配几块较大的内存,复制动作发生在这些大块内存之间)
④程序进入稳定状态后,可能只产生少量或不产生垃圾,尽管如此,复制式回收器仍然会将所有内存自一处复制到另一处。
2. 标记-清扫:从堆栈和静态存储区出发,遍历所有引用,进而找出所有存活的对象。每当他找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成后,清理动作才会开始。不会发生复制动作,所以剩下的堆空间是不连续的。
综述
还有,给块以相应的代数来记录它是否还存活。通常,如果块在某处被引用时,其代数会增加;这对处理大量短命的临时对象很有帮助。
自适应技术:对象稳定,垃圾回收器的效率较低的化,就切换到“标记-清扫”方法;如果堆空间出现很多碎片,就会切换回“停止-复制”方式。
1. 对象可能不被垃圾回收。
2. 垃圾回收并不等于“析构”。
3. 垃圾回收只与内存有关。
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。
垃圾回收器与Java堆的关系:
1. 在某些Java虚拟机中,堆的实现像传送带一样(并不完全),每分配一个新对象,它就往前移动一格;
2. 而在内存即将耗尽时,由于垃圾回收器的介入:它一面回收,一面使堆中的对象紧凑排列,使得“堆指针”就可以更容易移动到更靠近传送带的开始处,避免页面错误。
垃圾回收机制:
1.引用计数:简单但速度很慢
内容:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。垃圾回收器在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占有空间。
分析:管理引用的开销在整个程序生命周期中将持续发生。且如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数不为0”的情况。
更快的垃圾回收技术:
1. 思想:对任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有引用,就能找到所有“活的”对象。并且,对于每一个引用,必须追踪它所引用的对象,然后是此对象所包含的所有引用,如此反复进行,指导”根源于堆栈和静态存储区的引用“所形成的网络全部被访问为止。
2.方法技术:自适应的垃圾回收技术。如何找到的存活对象,取决于不同的Java虚拟机的实现。
做法:
1.停止-复制:先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。
①当对象被复制到新堆时,他们是一个挨着一个的,所以新堆紧凑排列;
②当把对象从一处搬到另一处时,所有指向它的那些引用都必须修正。
③效率低。首先要有两个堆,然后在这两个堆之间来回倒腾,从而维护比实际需要多一倍的空间。(所以,某些Java虚拟机按需从堆中分配几块较大的内存,复制动作发生在这些大块内存之间)
④程序进入稳定状态后,可能只产生少量或不产生垃圾,尽管如此,复制式回收器仍然会将所有内存自一处复制到另一处。
2. 标记-清扫:从堆栈和静态存储区出发,遍历所有引用,进而找出所有存活的对象。每当他找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成后,清理动作才会开始。不会发生复制动作,所以剩下的堆空间是不连续的。
综述
还有,给块以相应的代数来记录它是否还存活。通常,如果块在某处被引用时,其代数会增加;这对处理大量短命的临时对象很有帮助。
自适应技术:对象稳定,垃圾回收器的效率较低的化,就切换到“标记-清扫”方法;如果堆空间出现很多碎片,就会切换回“停止-复制”方式。