垃圾回收方法

1.引用计数法:

       给内存的对象弄上标记,被引用一次就加1,引用释放就减一,当为0时就可以被回收了。

      弊端:无法检测出循环引用。解决方案:第二种方法

 

 

2.根可达性分析法:

      从根开始搜索所有可达对象,剩下的就是可回收的

    - java中可作为GC Root的对象有:

    * 虚拟机栈中引用的对象(本地变量表)

    * 本地方法栈中引用的对象

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

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

 

  接下来就是根可达用哪些方法清除对象了:

   标记-清除:把可达性分析后剩下的对象直接清除。   弊端:会导致内存不连续(内存碎片)

   标记-整理:把可达性分析后确认仍被引用的对象向一端移动,清理掉边界以外的内存区域。解决了内存碎片化的问题

   复制:  将还存活着的对象复制到另外一块内存区域上面,然后再把已使用的内存空间一次清理掉,这样就不会导致内存碎片的问题。 弊端:内存压力大,每次只能使用一半的内存

   分代收集:  在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要少量存活对象的复制成本就可以完成收集。

                    而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或者“标记一整理”算法来进行回收

 

posted @ 2020-06-05 18:48  卑微小生  阅读(514)  评论(0)    收藏  举报