垃圾回收相关知识

Java 中,所有的对象都是要存在内存中的(也可以说内存中存储的是一个个对象),因此我们将内存回收,也可以叫做死亡对象的回收。

死亡对象的判断算法

a) 引用计数算法

引用计数描述的算法为 :
给对象增加一个引用计数器,每当有一个地方引用它时,计数器就 +1 ;当引用失效时,计数器就 -1 ;任何时刻计数器为0 的对象就是不能再被使用的,即对象已 " 死”。 但是,在主流的 JVM 中没有选用引用计数法来管理内存,最主要的原因就是引用计数法无法解决对象的 循环引用问题。

b) 可达性分析算法

此算法的核心思想为 : 通过一系列称为 "GC Roots" 的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为" 引用链 " ,当一个对象到 GC Roots 没有任何的引用链相连时 ( GC Roots 到这个对象不可达) 时,证明此对象是不可用的。
Java 语言中,可作为 GC Roots 的对象包含下面几种 :
1. 虚拟机栈 ( 栈帧中的本地变量表 ) 中引用的对象;
2. 方法区中类静态属性引用的对象;
3. 方法区中常量引用的对象;
4. 本地方法栈中 JNI(Native 方法 ) 引用的对象。

垃圾回收算法

a) 标记-清除算法

" 标记 - 清除 " 算法是最基础的收集算法。算法分为 " 标记 " " 清除 " 两个阶段 : 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
" 标记 - 清除 " 算法的不足主要有两个 :
1. 效率问题 : 标记和清除这两个过程的效率都不高
2. 空间问题 : 标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾收集。

b) 复制算法

" 复制 " 算法是为了解决 " 标记 - 清理 " 的效率问题。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配即可。

c) 标记-整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。 标记过程仍与 " 标记 - 清除 " 过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

d) 分代算法

分代算法是通过区域划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。
当前 JVM 垃圾收集都采用的是 " 分代收集 (Generational Collection)" 算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java 堆分为新生代和老年代。 在新生代中,每 次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没 有额外空间对它进行分配担保,就必须采用 " 标记 - 清理 " 或者 " 标记 - 整理 " 算法
哪些对象会进入新生代?哪些对象会进入老年代?
新生代:一般创建的对象都会进入新生代;
老年代:大对象和经历了 N 次(一般情况默认是 15 次)垃圾回收依然存活下来的对象会从新生代
移动到老年代。

垃圾收集器

垃圾收集器的作用:垃圾收集器是为了保证程序能够正常、持久运行的一种技术,它是将程序中不用的死亡对象也就是垃圾对象进行清除,从而保证了新对象能够正常申请到内存空间。

CMS收集器(老年代收集器,并发GC

CMS Concurrent Mark Sweep )收集器是一种以获取最短回收停顿时间为目标的收集器。目前
很大一部分的 Java 应用集中在互联网站或者 B/S 系统的服务端上,这类应用尤其重视服务的响应速
度,希望系统停顿时间最短,以给用户带来较好的体验。 CMS 收集器就非常符合这类应用的需 求。
CMS 收集器是基于 标记 清除 算法实现的,整个过程分为4 个步骤:
1.初始标记( CMS initial mark
初始标记仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要 “Stop The
World”
2.并发标记( CMS concurrent mark
并发标记阶段就是进行 GC Roots Tracing 的过程。
3.重新标记( CMS remark
重新标记阶段是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分
对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的
时间短,仍然需要 “Stop The World”
4.并发清除( CMS concurrent sweep
并发清除阶段会清除对象。
优点:
CMS 是一款优秀的收集器,它的主要优点在名字上已经体现出来了: 并发收集、低停顿。
缺点:
CMS 收集器对 CPU 资源非常敏感
CMS 收集器无法处理浮动垃圾
CMS 收集器会产生大量空间碎片

G1收集器(唯一一款全区域的垃圾回收器)

G1 Garbage First )垃圾回收器是用在 heap memory 很大的情况下,把 heap 划分为很多很多的
region 块,然后并行的对其进行垃圾回收。
G1 垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。
G1 垃圾回收器回收 region 的时候基本不会 STW ,而是基于 most garbage 优先回收 ( 整体来看是基于 " 标记- 整理 " 算法,从局部 ( 两个 region 之间 ) 基于 " 复制 " 算法 ) 的策略来对 region 进行垃圾回收的。
年轻代垃圾收集
G1 垃圾收集器中,年轻代的垃圾回收过程使用复制算法。
老年代垃圾收集
对于老年代上的垃圾收集, G1 垃圾收集器也分为 4 个阶段,基本跟 CMS 垃圾收集器一样,但略有不同:
1.初始标记 (Initial Mark) 阶段 -
CMS 垃圾收集器的 Initial Mark 阶段一样, G1 也需要暂停应用程序的执行,它会标记从根对象出发,在根对象的第一层孩子节点中标记所有可达的对象。 但是 G1 的垃圾收集器的 Initial Mark 阶段是跟 minor gc 一同发生的。也就是说,在 G1中,你不用像在CMS 那样,单独暂停应用程序的执行来运行 Initial Mark 阶段,而是在 G1 触发minor gc的时候一并将年老代上的 Initial Mark 给做了。
2.并发标记 (Concurrent Mark) 阶段
在这个阶段 G1 做的事情跟 CMS 一样。但 G1 同时还多做了一件事情,就是如果在Concurrent Mark 阶段中,发现哪些 Tenured region 中对象的存活率很小或者基本没有对象存活,那么G1 就会在这个阶段将其回收掉,而不用等到后面的 clean up阶段。这也是 Garbage First 名字的由来。同时 , 在该阶段, G1 会计算每个 region 的对象存活率,方便后面的clean up 阶段使用 。
3.最终标记 (CMS 中的 Remark 阶段
在这个阶段 G1 做的事情跟 CMS 一样 , 但是采用的算法不同,G1 采用一种叫做 SATB(snapshot-at-the-begining) 的算法能够在 Remark 阶段更快的标记可达对象。
4.筛选回收 (Clean up/Copy) 阶段
G1 中,没有 CMS 中对应的 Sweep 阶段。相反它有一个Clean up/Copy阶段,在这个阶段中 ,G1 会挑选出那些对象存活率低的 region 进行回收,这个阶段也是和minor gc 一同发生的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JVM垃圾回收是Java虚拟机的一个重要功能,它的知识体系包括以下内容: 1. 垃圾回收算法:垃圾回收算法是指垃圾回收器采用的垃圾回收策略。常见的垃圾回收算法包括标记-清除、复制、标记-压缩和分代等。 2. 垃圾回收器:垃圾回收器是JVM的一个组成部分,它负责执行垃圾回收算法,并回收Java对象的内存空间。常见的垃圾回收器包括Serial、Parallel、CMS、G1等。 3. 对象存判定:垃圾回收器需要判断哪些Java对象是可以回收的,哪些是必须保留的。存对象可以通过引用计数、可达性分析等方式判断。 4. 垃圾回收的过程:垃圾回收的过程包括标记、清除、整理等阶段。标记阶段是找到存对象的过程,清除阶段是回收无用对象的过程,整理阶段是将存对象移到一块连续的内存区域中。 5. 垃圾回收的性能优化:垃圾回收的性能优化包括分代、增量、并发、预处理等技术。分代是指将Java对象分为年轻代和老年代,以便针对不同的对象有针对性地进行垃圾回收。 6. 垃圾回收的调优和监控:垃圾回收的调优和监控可以通过调整堆大小、设置垃圾回收器类型、调整垃圾回收的参数等方式实现。 JVM垃圾回收是Java虚拟机的一个重要功能,掌握其知识体系可以帮助程序员更好地理解Java程序的内存模型和垃圾回收机制,从而编写出高效、可靠的Java程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值