深入了解Java虚拟机之垃圾收集器和内存分配策略

垃圾收集器在回收前要先判断哪些对象已“死去”。而判断是否死去有引用计数法和可达性分析法。

          1.引用计数法

                  给对象添加一个引用计数器,每引用一次计数器加一,引用失效一个就减一。当计数器为零时表明对象不能再被使用。优点:实现简单,判定效率高。缺点:很难解决循环引用的问题。循环引用如下:

                        class A {

                                 public Object instance=null;

                          }

                             class B{

                                 public Object instance=null;

                          }

                          class c {

                                public static void main(String[] args){

                                        A a=new A();

                                       B b=new B();

                                        a.instance=b;

                                        b.instance=a;

                                         a=null;

                                        b=null;

                                }

                          }

           2.可达性分析

                  通过一系列的称为“GC Roots”的对象为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,该对象即为不可达。则被判为可回收的对象。可作为GC Roots的对象有四种①虚拟机栈中引用的对象②方法区中静态属性引用的对象③方法区中常量引用的对象④本地方法栈中JNI(即native方法)引用的对象。补充:即使不可达,对象 也不一定非死不可,它有且仅有一次自救机会。真正死亡至少要经历两次标记。当被判为不可达时,标记一次,然后判断是否有必要执行finalize()方法(finalize()是对象逃脱死亡命运的最后一次机会)。如果有该对象则被放入F-Queue中。在finalize()中重新与引用链的任何一个对象建立关联,则会被移出即将回收的集合。任何对象的finalize()方法只会被系统调用一次。

       以上两种方法都与引用有关。在jdk1.2后引用被分为强引用,软引用,弱引用和虚引用四种。①强引用是类似Object o=new Object()的引用,只要存在强引用,被引用对象就永远不会被回收;②软引用用来描述有用但并非必须的对象,在系统面临内存溢出前被回收③弱引用用来描述非必须对象,被引用的对象只能存活到下一次GC前。用WeakReference来实现弱引用④虚引用是最弱的引用关系。无法通过虚引用获得对象实例,唯一目的是 被引用对象再被回收时收到系统通知。用PhantomReference来实现虚引用

       垃圾收集算法

          标记-清除算法

               首先标记出所有需要回收的对象,在标记完后统一回收。不足:效率不高,会产生内存碎片。

          复制算法

              一个Eden区 两个survivor区,比例为8:1:1。每次使用Eden和一个survivor区,在回收时存活的对象复制到空闲的survivor中。如果survivor空间不够用时,需要依赖其他内存(年老代)进行分配担保。如果空间不够,对象通过分配担保机制进入年老代。

         标记-整理算法

              需要回收的对象被标记后,将存活的对象移向一端,要被回收的对象移向另一端再清理。

        分代收集算法

                 把堆分为新生代和老年代,根据年代的特点采用合适的算法。新声代采用复制算法,老年代使用标记清除或标记整理算法。

        垃圾收集器

    解释两个概念

       并行:多条垃圾线程并行工作,而用户程序处于等待状态

      并发:用户线程与垃圾回收线程同时执行

         上图连线表示可以搭配使用

      serial:单线程收集器,在进行垃圾收集时必须暂停其他所有的工作线程,直到它收集结束。优点:简单高效,可获得最高的单线程收集效率。

      parNew:serial的多线程版本,使用 多条线程进行垃圾收集。第一次实现了让垃圾收集线程和用户线程基本上同时工作。但不一定是并行的可能交替执行。用户程序在继续运行,垃圾回收程序运行在另一个CPU上

     parallel  scavenge:并行的多线程收集器。目标是达到一个可控制的吞吐量。高吞吐量可以高效的利用CPU时间,主要适合在后台运算而不需要太多交互的任务

   serial old:单线程收集器,使用标记整理算法。给处于client模式下 的虚拟机使用

   parallel old:使用多线程和标记整理算法

    cms:以获取最短回收停顿时间为目标的收集器,应用主要集中在互联网站或B/S系统的服务端上。使用标记清除算法

    G1:面向服务端应用的垃圾回收器

       




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值