JVM垃圾收集相关概念

垃圾收集器

在这里插入图片描述

Serial串行收集器

serial串行收集器是最基本、历史最长的收集器。
特点:新生代收集器,单线程收集器,在执行GC过程时,会暂定所有用户线程,GC完成之后其他用户线程才能继续执行。
缺点:执行GC过程暂定所有用户线程,如果内存大,垃圾多,GC时间过长,导致系统长时间没有反应,用户体验不好。
适用情况:单cpu情况下,没有线程交互开销,适用于Client模式,如桌面应用场景,分配给虚拟机的内存不会很大,几十到几百兆之间,内存不大时,回收速度会快。

ParNew收集器

将GC线程由单线程变为多线程。其他并无改变。在GC时,同样需要“STOP THE WORLD”。
优势:相比serial收集器,由单线程改进为多线程;相比Parallel收集器,能与老年代并发收集器CMS配合使用。
缺点:在单cpu情况下,收集效果不如Serial收集器,因为存在线程交互的开销。
适用范围:Server模式下的虚拟机中,因为server模式下必然是多核

Parallel Scanvage

与ParNew收集器一样,Parallel Scanvage收集器属于多线程的新生代收集器。与PaNew不同的地方是ParNew关注的是尽可能缩短GC时间,而Parallel Scanvage关注的是提高吞吐量(吞吐量=用户线程执行时间/(用户线程执行时间+GC线程执行时间))。所以,ParNew适用于与用户进行交互的环境下,停顿时间短,用户体验更好。提供两个参数用于控制停顿时间以及吞吐量
适用范围:高效率利用cpu时间,不需要与用户进行交互,在后台快速执行计算任务。
优势:提升吞吐量,自适应调节策略(根据系统运行情况,自适应调整相应jvm参数)

Serial Old

Serial收集器的老年代版本,同样是单线程环境下,采用的是标记-整理算法。

Parallel Old收集器

Parallel Scanvage的老年代版本,采用标记-整理算法。与Parallel Scanvage组合适用于注重吞吐量,cpu资源敏感的环境中。

CMS收集器

采用标记-清除算法,目标旨在缩短停顿时间。最大的特点是将GC过程划分成4个步骤,在其中2个步骤中是可以并发执行,也即是执行用户线程的同时,其他cpu可以执行GC中的并发步骤。由于并发的加入,所以CMS收集器,系统停顿时间短。

适用范围:对响应时间要求比较高的B/S系统的服务端。

过程:
初始标记:标记出与GC Roots直接关联的引用,速度很快
并发标记:能与用户线程并发执行,标记出GC Roots引用链上所有对象
重新标记:由于并发标记时,用户线程也在执行,这一部分用于修改并发标记时部分引用变动的情况。
并发清除
在以上4个步骤中,初始标记和重新标记必须要暂停用户线程,但是这俩个步骤执行速度很快,并发标记和并发清除,耗时较长,与用户线程可以并发执行。

缺点:
1)无法处理浮动垃圾,可能会出现“Concurrent Mode Failure”而导致FULL GC,这是由于在并发清除过程中会产生新垃圾,而新的垃圾只能等到下次垃圾收集时再进行清除。由于CMS在执行GC的过程中还可以执行用户线程,所以需要预留一定的空间,不能等到空间快满时才进行GC,如果预留的空间不够新对象所需的空间,将会发生“Concurrent Mode Failure”,此时会将Serial Old作为老年代收集器,进行垃圾回收。
2)空间碎片,由于CMS采用标记-清除算法,所以容易产生空间碎片,如果大对象找不到足够的连续空间,将会频繁地启用FULL GC,同样影响系统性能。在CMS中,针对空间碎片问题,CMS提供了一个可以进行内存整理的开关参数。
3)对cpu资源敏感,在并发阶段,由于占用了用户线程,所以吞吐量会下降。

收集算法

标记-清除算法(Mark-Sweep)

首先标记出需要回收的对象,在标记完成后统一回收掉所有的被标记对象。
缺点:效率问题和空间问题(标记清除后会产生大量的不连续内存碎片,内存碎片过多可能会导致程序需要分配较大对象时找不到足够大的连续内存空间而不得不提前触发另一次垃圾回收动作)

复制算法(Copying)

将内存划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,就将还存活的对象复制到另一块内存上,然后把已使用过的内存空间一次清理掉。
优点:每次只对其中一块进行GC,不用考虑内存碎片的问题,并且实现简单,运行高效
缺点:内存缩小了一半

注:现在的商业虚拟机都是用这种收集算法回收新生代。内存分为一块较大的Eden空间和两块较小的Survior空间,每次使用Eden和其中的一块Survior.当回收时,将Eden和Survior中还存活的对象一次性拷贝到另外一块Survior空间上,最后清理Eden和刚才用过的Survior空间。

标记-整理算法(Mark-Compact)

让所有存活对象都向一端移动,然后直接清理掉端边界以外的所有内存。

标记算法

根搜索算法(GC Root Tracing)

通过一系列的名为“GC Root”的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,证明该对象是可以被回收的。

在Java中哪些对象可以成为GC Root?
虚拟机栈(栈帧中的本地变量表)中的引用对象
方法区中的类静态属性引用的对象
方法区中的常量引用对象
本地方法栈中JNI(即Native方法)的引用对象

引用计数算法(Reference Counting)

给对象添加一个引用计数器,每当一个地方引用它时,数据器加1;当引用失效时,计数器减1;计数器为0的即可被回收。
优点:实现简单,判断效率高
缺点:很难解决对象之间的相互循环引用问题,所以java语言并没有选用引用计数法管理内存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值