Java GC垃圾回收机制

    咱们来谈谈垃圾回收机制吧

    首先先理解jvm虚拟机内存分配 :

   程序计数器:一个小块内存,当前线程字节码的行号指示器,线程所有

    java虚拟机栈:每个方法运行时都会创建一个栈帧 线程所有

    java堆:存放对象实例,所有线程共享

    方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据,所有线程共享

         运行时常量池:方法区的一部分 用于存放编译期生成的各种字面变量和符号引用,所有线程共享

   

    对象的内存布局:

    对象存储布局可以分为3块区域:对象头,实例数据,对齐填充

    对象头用于存储对象运行时数据如HashCode,GC分代年龄,锁状态标志,线程持有锁,偏向线程ID,偏向时间戳等

            对象头的另外一部分是类型指针,即对象指向它的元数据的指针,虚拟机通过这个指针确定对象是哪个类的实例

     实例数据是真正存储的有效信息

   对其填充:仅仅起着占位符的作用,因为对象起始的地址必须是8字节的整数倍

 

     回收方法区:

     回收方法区的效率比较低,条件比较苛刻

      

     堆回收:

     java堆回收 首先java堆回收 是分代回收  分为新生代和老年代。对新生代的回收是用minorGC  对新生代和老年代都进行回收称FullGC     

 

     新生代进入老年代回收:

      新生代的对象每次经历GC还活着,就在它的对象头的年龄标记数+1,这个数字超过一定的数,则对象进入老年代。但是不是绝对的,比较灵活,例如一些对象远超过其他对象年代平均值也把对象复制到老年代。还有一种情况,新生代suvivor保存不了那么多存活的对象,多余的对象也进入老年代。

 

   

    对新生代回收

     对新生代回收 新生代回收是用标记-清除的算法  把新生代分成Eden和Survivor 内存占比8:1  有一个Eden 两个Survivor。

据统计新生代GC一般能够回收98%内存。如果我们把两个Survivor 标成Survivor A  Survivor B,GC回收先从Eden 和Survivor A 回收  回收之后还活着的复制到Survivor B 再清除Survivor A 和Eden所有的内存 ,下一次回收 回收Survivor B和 Eden ,然后回收之后还活着的对象复制到Survivor A ,再清除 Survivor B和恶Eden所有内存  如此往复。 当还活着的对象比较多,Survivor不能存入所有的对象,则把一些对象存入老年代。

 

    标记回收:

    新生代里面的对象,经过可达性分析算法之后,不可达的对象进行回收,每一个对象回收都至少经历两次标记,对象在进行可达性分析之后发现没有与GC Roots相连的引用链,它会被标记并且进行筛选,筛选条件是对象是否有必要执行finalize()方法,当finalize()被调用一次或者对象没有覆盖fin'a'lize(),虚拟机认为没有必要执行。

    如果对象有必要执行finalize()方法,那么对象会被放置在F-Queue的队列中,并且由一个Finalize线程去去执行它,稍后GC对F-Queue中的对象进行第二次小规模标记,如果在finalize()方法调用之后,finalize 通过 GC Roots可达性分析可达,那么就成功的活了下来

    

     可达性分析算法:

      算法思路通过一系列的GC Roots对象作为起点,从这些节点开始向下搜索,搜索所有所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连时 就证明这个对象不可用,它们将会被判定可回收到对象

      在java语言中,可作为GC Roots对象包括:

      虚拟机栈(帧栈中的本地列表)中引用的对象

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

      方法区中常量的引用对象

      本地方法栈中JNI(即一般说是Native方法)引用的对象

 

      再多延申就是OopMap 安全点 安全区

 

 

 

 

 

 

 

 

 

 

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值