《JVM》第二章 JVM垃圾回收器

2 篇文章 0 订阅

一、概述

JVM会自动帮我们分配内存,同样它也会自动帮助我们回收内存,开发人员不需要像编写C++语言那样在代码里显式的进行内存回收,本章会介绍几种常用的回收算法以及HotSpot虚拟机的所存在的多种垃圾回收器,了解垃圾回收的目的是:需要排查内存溢出、内存泄漏等问题,或当系统并发量提升导致垃圾回收成器称为系统响应的瓶颈时方便我们进行必要的监控和调节

二、常用回收算法

标记清除:

    

标记清楚算法是最基础的收集算法,其他收集算法都是基于这种思想。标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象

它的主要缺点:

①.标记和清除过程效率不高。

②.标记清除后会产生大量不连续的内存碎片

标记整理:

标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动,并更新引用其对象的指针

它的主要缺点:

①.在标记-清除的基础上还需进行对象的移动,成本相对较高

复制算法:

它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另一块上面,然后在把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块内存进行回收,不会产生碎片等情况,只要移动相应指针,按顺序分配内存即可,实现简单,运行高效

它的主要缺点:

①.内存缩小为原来的一半

三、分代收集

回到上一章遗留的问题:"为什么要区分老年代和年轻代"?

年轻代特点:每次存活的对象远远小于被回收的对象

老年代特点:每次存活的对象理论上大于被回收的对象

基于性能方面的考虑及不同代的对象特点,目前多数商用虚拟机都采用分代收集方式,既年轻代采用复制算法,老年代采用标记-清理或标记整理算法,这也就是为什么要把堆内存区分为年轻代和老年代的原因之一。


四、如何判定对象“死亡”?

判定对象“死亡”常用有两种算法

1、引用计数法:

引用计数法的逻辑是:在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相连,则将counter++。如果一个引用关系失效则counter–。如果一个对象的counter变为0,则说明该对象已经被废弃,不处于存活状态。

缺点:循环引用问题不好解决

2、可达性分析法:

在介绍可达性分析算法前先来解释一个名词“GC Roots”,"GC Roots"其实就是“根结点对象”的内存地址,那么什么是“根结点对象”呢?

例如:A对象引用B对象,B对象引用C对象,那么A对象就可以作为一个“根结点对象”,“根结节对象”往往会存在很多个,当垃圾回收器查找这些根结点的时候往往需要“Stop The Word”,简单说就是停止你所有的线程,如果是一个Gui程序,一个明显的现象就是用户操作界面后没有反应。

那么那些点可以作为GC Roots呢?一般来说,如下情况的对象可以作为GC Roots:

  1. 虚拟机栈(栈桢中的本地变量表)中的引用的对象(可以理解为方法中的局部变量)
  2. 方法区中的类静态属性引用的对象
  3. 方法区中的常量引用的对象 (也是静态的)
  4. 本地方法栈中JNI(Native方法)的引用的对象 

在了解完“GC Roots”后我们来学习一下可达性分析的算法,这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,下图对象object5, object6, object7虽然有互相判断,但它们到GC Roots是不可达的,所以它们将会判定为是可回收对象。



在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。

五、几种垃圾回收器

由于采用分代收集,所以垃圾回收器也分为年轻代垃圾回收器和老年代垃圾回收器,更深入了解请参考 点击打开链接 已经描述的比较详细了





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值