```算法
虚拟机将再也不会被使用的对象进行回收处理,其实也就是将这些对象(称为死亡对象)从内存中消除,释放内存空间优化
```spa
可触及性算法是判断对象是否死亡的最基本的算法。所谓死亡对象就是内存堆中再也不使用的对象。
用于被GC回收的对象。指针
引用计数法是给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1,
当引用失效时,计数器减1;任什么时候候计算器都为0的对象就是不可触及的对象。对象Reference Counting 断定效率高,实现简单。
微软的COM,ActionScript3,FlashPlayer3,Python 都采用Reference Counting来计算ipJava 语言中没有采用这个算法的主要缘由是,它难以解决循环引用的问题。内存
基本思路就是就是经过一系列名为 GC Root 的对象做为起始点,从这些节点开始向下搜索,
搜索走过的路劲做为引用链,当一个对象到GC Root 没有任何引用链时,则证实此对象不可触及ci
GC Root 包括如下几种虚拟机
虚拟机栈中的引用的对象io
方法区中的类静态属性引用的对象
方法区中的常量引用的对象
本地方法栈中JNI的引用的对象。
标记-清楚算法是最基本的算法,其算法分为两个阶段,标记阶段和清除阶段。
首先标记出所须要回收的对象,标记完成后统一收掉全部的被标记的对象。
他的缺点主要有两个:
效率问题,标记和清除的效率都不高
空间问题,标记清除后会产生大量的碎片内存
为了解决效率问题,复制算法将可用内存分为大小相等的两块,每次只用其中一块。
当一块内存用完了,就将还存活着的对象复制到另一块上面,而后把已用过的内存空间一次清理掉。内存分配不用考虑碎片等复杂状况,只要移动堆顶指针,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半。
**
在实际应用中,不会简单的把全部存活对象从一边拷贝到另一边,通过优化,会把大对象放到老生代的内存区域中,这一动做其实就是内存分配担保的一个动做(Handle Promotion)。
咱们没有办法保证每次须要复制的内存对象 在另外一块区域必定够,这时须要借一块区域一般来讲是老年代存放,在清理以后在放回去,或者说就长期放在老年代了。
**
标记-压缩算法是 标记-清除算法的一种优化,标记过程仍然同样,但后续步骤不是直接对可回收对象进行清理,而是让全部存活的对象都向一端移动,而后直接清理掉端边界之外的内存。
所谓分代收集实际上是各类回收算法的综合应用。根据对象的存活周期的不一样将内存划分为几块。通常是把Java堆分为新生代和老年代。 新生代中,每次垃圾收集时都要发现大批对象死去,只有少许存活,那就选用复制算法,只需付出少许存活对象的复制。 而老年代中由于对象的存活率高,没有额外的空间对它进行分配担保,就必须使用标记清理或者压缩算法。