zoukankan      html  css  js  c++  java
  • 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. 分代手机算法,青年代中用复制算法,老年代用标记-清理或是标记-整理算法。

      

  • 相关阅读:
    你的程序员是在努力工作还是在偷懒?
    React 入门实例教程[阮一峰的网络日志] (分享)
    给大家分享下坐标转换的代码的JS和Python两个版本的源码【转】
    一个不错的 在线字体 网站
    用Python作GIS之一:介入STARS
    UI“三重天”之selenium--封装(二)
    UI“三重天”之Selenium(一)
    “点点点”的误区
    (转)CentOS 7安装Zabbix 3.4
    Ui"三重天"之重温Uiaumator(1)
  • 原文地址:https://www.cnblogs.com/kisf/p/6961361.html
Copyright © 2011-2022 走看看