zoukankan      html  css  js  c++  java
  • 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虚拟机

  • 相关阅读:
    (1)一步一步开发一个简单二维CAD之基本框架
    weekly review 200844: Lazy
    《理解专业程序员》读书笔记
    weekly review 200843: House M.D.
    weekly review 200846: table tennis
    weekly review 200845: Work Hard Not Enough
    Change Your Mind and Your Life Will Follow
    weekly review 200847: tdd
    爱心·王搏计划“走出地震”影展需要志愿者(11月24日——11月26日)
    read_notes
  • 原文地址:https://www.cnblogs.com/feizhai/p/9197853.html
Copyright © 2011-2022 走看看