jvm的经典回收算法

一.垃圾回收的两个方法

  1.引用计数算法

      对象添加计数器,被引用一次计数器自加1,当引用失效计数器减1,当计数器为0的时候,

      对象就是处于可以回收的状态。(也就是不可用的状态)

          这个计数算法的好处就是实现简单。坏处就是当有两个对象相互引用,GC收集就会失败。

    2.根搜索算法

      根搜索算法这个就是 GC Roots对象作为起点,然后形成一个引用链(Reference Chain)

      如果对象不再这个引用链上(不可达)将会被认为是可回收的对象

二.GC回收的对象以及几个引用

    GC回收的对象

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

   2.方法区中的静态变量。

   3.方法区中的常量。

   4.Native方法中的引用对象。

  引用的类型(由强到弱)

   1.强引用:new出来的对象

   2.软引用:可有可无的引用,SortReference类实现

   3.弱引用:非必要对象,只能生存到下一次GC前,通过WeakReference来实现

   4.虚引用:一个对象的生存跟虚引用没关系,构不成影响,作用就是GC前的一次系统通知

三.对象的存亡

  首先如果是不可达的对象,那就被缓刑了,至少经历两次标记然后就会被GC。(没有覆盖finalize方法)

  如果finalize方法中有机会返回引用链那么对象就逃逸了(finalize只能被执行一次,就是对象自救只能一次)

  逃逸不了就真的要死刑了

四.方法区的垃圾回收

  1.废弃常量的回收,这个跟Java堆中的回收方法差不多,只要没有被引用就有可能会被GC。

  2.无用类的回收,这个回收条件就相当的苛刻,首先判断它是可回收的(下面三个步骤)

    2.1类中的生成的实例都被回收

    2.2加载该类的ClassLoader已经被回收

    2.3该类已经完全没有被引用(反射等)

    满足上面三个条件这个类只是可以被回收

五.垃圾回收算法

  1.标记清除算法:先标记要回收的对象,然后收集。

 

    缺点:1.标记与清除的效率都不高。2.产生大量的内存碎片。

    2.复制算法:分为Eden:Survivor from:Survivor to = 8:1:1(新生代的比例)新生代

    Eden与from这两个是用来保留新对象的,GC后Eden存活的对象就会到to,

    而from存活的就会“老一岁“(标志加1)。到达阈值就会移进老年代。(而且老年代会

    做出分配担保)

 

    3.标记整理算法:就是标记清除的改进,还多了整理,使得不会产生许多内存碎片。

  

  4.分代收集算法:分为老年代与新生代,各代的收集算法都不一样。

  参考:深入理解java虚拟机

 

posted @ 2018-06-19 11:39  肥仔中意编程  阅读(487)  评论(0编辑  收藏  举报