JAVA-JVM垃圾回收算法

 

哪些对象可以回收,有两种算法:

1. 引用计数算法,对象被引用计数器加1,对象被释放计数器减1。计数器为0的对象是可以被回收的。

  此种方法优点:简单。缺点:会存在互相引用的两个对象,但实际这两个对象都没有用了。但各自计数器不为0,永远不能被回收。

2. 可达性分析算法,从一系列GC Roots作为起点,开始往下搜索,搜索经过的路径叫做引用链,没有在链上的对象是可以被回收的。这样,即使有互相引用的对象,但没有在引用链上,也会被回收。

  GC Roots 包括:

    (1)虚拟机栈中引用的对象。

    (2)方法区中类静态属性引用的对象。

    (3)方法区中常量引用的对象。

    (4)Native方法中引用的对象。

引用分4个等级:

  (1)强引用,类似与 Object o = new Object()这类引用。这类被引用的对象永远不会被回收。

  (2)软引用,有用但是非必须的对象。在内存溢出前,这类对象将被列进回收范围等待二次回收。如果第二次回收后,还是没有足够内存,则内存溢出。

  (3)弱引用,非必须的对象,弱引用关联的对象可生存在下一次回收之前。下次回收不管内存是否够都会被回收。

  (4)虚引用,此引用存在的唯一目的是,能收到回收的系统消息。随时被回收。

finalize()方法,系统GC是会别调用,重写该方法可以实现即将被回收对象的自我救赎,即可逃过第一次回收。但第二回收时,finalize ()方法不会被调用。

垃圾回收算法:

1. 标记-清除算法,两个阶段,首先对需要被回收的对象进行标记,再对被标记过的对象进行清除。

  最原始的垃圾回收算法。

2. 复制算法,将内存分为两个区,将不能回收的对象复制到另外一个区,在将原来的区整个清除。两个去交替进行。

  优点:速度快。缺点:需要两倍的存储空间。

  适合young edge回收。

3. 标记-整理算法,将需要被回收的对象进行标记,然后对不需要的对象进行规整,充分利用碎片空间。

  适合old edge回收。

4. 分代手机算法,青年代中用复制算法,老年代用标记-清理或是标记-整理算法。

  

 

posted @ 2017-06-08 10:01  Jenkin.K  阅读(228)  评论(0编辑  收藏  举报