内存管理机制-JVM 垃圾回收算法

RoadMap

 

什么是垃圾回收

```算法

     虚拟机将再也不会被使用的对象进行回收处理,其实也就是将这些对象(称为死亡对象)从内存中消除,释放内存空间优化

```spa

如何判断死亡对象(对象可触及性算法)

 

可触及性算法是判断对象是否死亡的最基本的算法。所谓死亡对象就是内存堆中再也不使用的对象。 
用于被GC回收的对象。指针

1. 引用计数算法 Reference Counting

引用计数法是给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1, 
当引用失效时,计数器减1;任什么时候候计算器都为0的对象就是不可触及的对象。对象

Reference Counting 断定效率高,实现简单。 
微软的COM,ActionScript3,FlashPlayer3,Python 都采用Reference Counting来计算ip

Java 语言中没有采用这个算法的主要缘由是,它难以解决循环引用的问题。内存

2. 根搜索算法 GC Root Tracing

基本思路就是就是经过一系列名为 GC Root 的对象做为起始点,从这些节点开始向下搜索, 
搜索走过的路劲做为引用链,当一个对象到GC Root 没有任何引用链时,则证实此对象不可触及ci

GC Root 包括如下几种虚拟机

  • 虚拟机栈中的引用的对象io

  • 方法区中的类静态属性引用的对象

  • 方法区中的常量引用的对象

  • 本地方法栈中JNI的引用的对象。

垃圾回收算法

1. 标记-清楚算法 Mark-Sweep

标记-清楚算法是最基本的算法,其算法分为两个阶段,标记阶段和清除阶段。 
首先标记出所须要回收的对象,标记完成后统一收掉全部的被标记的对象。

他的缺点主要有两个:

  • 效率问题,标记和清除的效率都不高

  • 空间问题,标记清除后会产生大量的碎片内存

2. 复制算法 Copying

为了解决效率问题,复制算法将可用内存分为大小相等的两块,每次只用其中一块。 
当一块内存用完了,就将还存活着的对象复制到另一块上面,而后把已用过的内存空间一次清理掉。

内存分配不用考虑碎片等复杂状况,只要移动堆顶指针,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半。

** 
在实际应用中,不会简单的把全部存活对象从一边拷贝到另一边,通过优化,会把大对象放到老生代的内存区域中,这一动做其实就是内存分配担保的一个动做(Handle Promotion)。 
咱们没有办法保证每次须要复制的内存对象 在另外一块区域必定够,这时须要借一块区域一般来讲是老年代存放,在清理以后在放回去,或者说就长期放在老年代了。 
**

3. 标记-压缩算法 Mark-Compact

标记-压缩算法是 标记-清除算法的一种优化,标记过程仍然同样,但后续步骤不是直接对可回收对象进行清理,而是让全部存活的对象都向一端移动,而后直接清理掉端边界之外的内存。

分代收集 General Collection

所谓分代收集实际上是各类回收算法的综合应用。根据对象的存活周期的不一样将内存划分为几块。通常是把Java堆分为新生代和老年代。  新生代中,每次垃圾收集时都要发现大批对象死去,只有少许存活,那就选用复制算法,只需付出少许存活对象的复制。  而老年代中由于对象的存活率高,没有额外的空间对它进行分配担保,就必须使用标记清理或者压缩算法。

相关文章
相关标签/搜索