一、垃圾回收器如何工作?
1、Java虚拟机将采用一种自适用的垃圾回收技术。
停止-复制:
原理: 先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,他们是一个挨着一个的,所以新堆保持着紧凑的排列,当对象从一处搬到另一处的时候,所有指向它的引用都必须修正,位于堆和静态存储区的引用可以直接被修正,但可能还有其他指向这些对象的引用,他们在遍历的过程中才能被找到。
劣势: 这种所谓的“复制式回收器”,效率会降低,首先,有两个堆,然后在之间来回倒腾,从而得维护比实际需要多一倍的空间。某些Java虚拟机处理方式,按需从堆中分配几块较大的内存,复制动作发生在这些大块的内存之间。 第二个问题,程序进入稳定状态之后,可能只会产生少量垃圾,甚至没有垃圾,尽管如此,复制回收器仍然会将所有的内存自一处复制到另一处,很是浪费。
标记-清扫:
原理: 从堆栈和静态存储区出发,遍历所有的引用,进而找出所有的存活的对象。每当它找到一个存活的对象,将会给对象设置一个标记,这个过程中将不会回收任何对象,只有全部标记工作完成,清理动作才会开始。在清理过程中,没有标记的对象将会被释放,不会发生任何复制的动作。
劣势: 速度相当慢,所有剩下的堆空间是不连续的,垃圾回收是希望的连续的话,就得重新整理剩下的对象。
总结: 一些Java虚拟机会进行检查,停止-复制下 要是没有新垃圾产生,就会转换到另一种工作模式,即标记-清扫。