java虚拟机——垃圾回收器

Serial收集器:

serial收集器是最基本的发展最悠久的收集器,这是一个单线程收集器,它只会使用一个CPU,一个收集线程去完成垃圾收集工作,更重要的是它进行垃圾收集工作时必须暂停所有的其他线程,直到它收集结束。暂停所有线程,stop the  world,在用户看不见的情况下把用户正常工作的线程给全部停止。

下图示意了  Serial/Serial Old收集器的运行过程。

 相对优点:依然是虚拟机运行在client模式下的默认新生代收集器,简单而高效,单个cpu,没有线程交互开销,专心GC,获得最高的单线程收集效率。

ParNew收集器:是serial的多线程版本。

 优点:除了多线程收集,与serial收集器并没有太多创新,是server模式下的首选新生代收集器,一个与性能无关但很重要的原因是:除了serial之外,只有它能与CMS收集器配合工作。

Parallel Scavenge 收集器:一个新生代收集器,copying算法,并行多线程收集器。吞吐量优先收集器

其他的收集器只是尽可能的缩短垃圾收集时用户线程停顿的时间,而parallel Scavenge收集器的目标是达到一个可控吞吐量,

吞吐量=运行用户代码时间/(用户时间+GC时间),提供两个参数来精确控制吞吐量①控制最大垃圾收集时间

-XX:MaxGCPauseMillis,②直接设置吞吐量大小, -XX:GCTimeRatio。

不要认为把 MaxGCPauseMillis这个值设置的小一些,就能使垃圾收集的速度变得更快。GC停顿时间的缩短使以牺牲吞吐量和新生代空间的大小来换取的。

Parallel Scavenge 收集器还有一个参数 -XX:+UseAdaptiveSizePolicy 这是一个开关参数,打开之后就不需要指定新生代大小,eden,survivor的比例,等细节的参数,它会根据当前系统运行的情况,动态调整这些参数,提供最合适的停顿时间或者最大吞吐量,称之为GC自适应策略,是parallel scavenge与parNew的一个重要区别。

Serial Old收集器:是serial收集器的老年代版本,使用Mark-Compact,单线程收集器,主要意义在于给client模式下的虚拟机使用

①在jdk1.5之前版本与parallel Scavenge 搭配 ②作为CMS收集器的后备预案

Parallel Old收集器:是parallel scavenge 收集器的老年代版本,多线程收集器,Mark-compact ,在此之前如果新生代选择parallel  scavenge收集器,那么老年代除了serial old没有别的收集器可以选择。由于老年代serial old 收集器在服务端应用性能的拖累,使用parallel  scavenge收集器也未必能在整体应用上获取吞吐量最大化的效果,直到parallel old的出现,“吞吐量优先”收集器才有了名副其实的应用组合。

CMS收集器  concurrent Mark sweep 是一种获取最短回收停顿时间为目标的收集器,基于Mark-Sweep算法,主要分为四个步骤

①初始标记②并发标记③重新标记④并发清除

其中初始标记和重新标记仍需要stop  the  world

初始标记:仅仅标记一下GCRoots能直接关联到的对象,速度很快

并发标记:进行GCRoots  tracing 过程

重新标记:为了修正并发标记期间,用户线程运行而导致标记变动的一部分对象的记录

由于过程中耗时最长的并发标记和并发清除过程收集器线程与用户线程一起工作,所以总体上来说CMS的内存回收与用户线程一起并发执行的。

CMS对cpu资源非常的敏感,CMS默认  回收线程数=(cpu数量+3)/4,当cpu不足4个,比如2个,CMS对用户线程影响可能变得很大,cpu还要分出一半的运算能力去执行收集线程。为了解决这个问题,虚拟机提供了一种增量式并发收集器,就是在并发标记和清理的时候让GC线程和用户线程交替运行,尽量减少GC线程独占资源的时间,但垃圾收集时间会更长些,实践证明i-CMS效果很一般,已经被声明为不提倡使用。

CMS无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”而导致一次full  Gc。因为在并发清理的过程中还有一部分用户线程在运行,会有新的垃圾不断产生新的垃圾,CMS无法在当次处理掉它,只好留到下次处理,这一部分垃圾就是“浮动垃圾“ 在gc阶段,用户线程也在运行,就要有足够的内存给用户线程使用,因此CMS不能像其它收集器一样老年代几乎填满了再进行收集,需要预留一部分空间来满足并发收集时用户程序运行使用。要是运行期间内存无法满足程序的需要,就会出现Concurrent Mode Failue,这时候虚拟机的后备预案,使用serial old重新对老年代的垃圾进行收集

内存碎片:使用-XX:CMSFullGCsBeforeCompaction,这个参数表示执行多少次不压缩的full  gc跟着来一次带压缩的full  gc,默认为0

G1收集器:Garbage  first,是当前收集器技术里面最前沿的成果之一,面向服务端应用的垃圾收集器

G1的特点:并发与并行,G1能够充分的利用cpu多核环境下的优势,缩短停顿时间,G1使用并发的方式让java程序继续执行。可预测停顿,这是G1相对于CMS的一大优势,能让使用者明确的指定在一个长度为M毫秒的时间内消耗在GC上的时间不超过N毫秒,这几乎是实时java垃圾收集器的特征了

G1收集器内存的布局和其它收集器有很大的差别,它将整个java堆分成多个大小相当的独立区域(Region)虽然还保留了新生代和老年代,但是新生代和老年代不再是物理隔离,它们是一部分region(不需要连续)的集合

G1收集器能建立可预测停顿时间模型,是因为它有计划的避免在整个java堆进行全区域垃圾收集,G1跟踪各个region中的垃圾堆积价值大小(回收所获得的空间大小及回收所需要时间的经验值)在后台维护一张优先列表,每次根据允许收集时间,优先回收价值最大的Region,这就是G1名字的由来,这种方式保证了G1收集器在有限的时间内尽可能的高的收集效率

Regin之间的对象引用以及其它收集器中新生代与老年代之间对象的引用虚拟机都是采用Rembered Set来避免全局扫描,G1中每一个region'都有一个rembered  set与之对于,当虚拟机发现程序对reference类型的数据进行写操作的时候,会检查reference引用的对像是否处于不同的region之中,若是,就把引用信息记录到被引用对象所属的region的rembered set中,当回收内存时GC根节点枚举范围加入Remember set即可保证不读全堆扫描,也不会遗漏

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值