澳门葡亰娱乐场手机版-澳门新葡亰手机娱乐网址


垃圾回收g1(g1垃圾回收的缺点)

文章发布时间:2019-12-03 10:12:02
回收

g1垃圾回收的缺点

Java只有一个垃圾收集器,而事实上它有4个。Java9中,仍有一个运行提议,关于替换由Java7引入的G1默认垃圾收集器(并行/吞吐量收集)的讨论。
通常来说,G1被设计来更好地支持大于4GB的堆,并且不会造成频繁的GC暂停,但当暂停发生时,往往会处理更长时间。

g1垃圾回收器详解

Java只有一个垃圾收集器,而事实上它有4个。Java9中,仍有一个运行提议,关于替换由Java7引入的G1默认垃圾收集器(并行/吞吐量收集)的讨论。
通常来说,G1被设计来更好地支持大于4GB的堆,并且不会造成频繁的GC暂停,但当暂停发生时,往往会处理更长时间。

垃圾回收算法g1

一、垃圾收集器概述

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。

JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

二、各个垃圾收集器说明

1、Serial(年轻代)

  • 年轻代收集器,可以和Serial Old、CMS组合使用

  • 采用复制算法

  • 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止

  • client模式年轻代默认算法

  • GC日志关键字:DefNew(Default New Generation)

  • 图示(Serial+Serial Old)

  • 2、ParNew(年轻代)

  • 新生代收集器,可以和Serial Old、CMS组合使用

  • 采用复制算法

  • 使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样

  • server模式年轻代默认算法

  • 使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数

  • GC日志关键字:ParNew(Parallel New Generation)

  • 图示(ParNew + Serail Old)

  • 3、Paralle Scavenge(年轻代)

  • 新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用

  • 采用复制算法

  • 使用多线程进行垃圾回收,回收时会导致Stop The World

  • 关注系统吞吐量

  • -XX:MaxGCPauseMillis:设置大于0的毫秒数,收集器尽可能在该时间内完成垃圾回收

  • -XX:GCTimeRatio:大于0小于100的整数,即垃圾回收时间占总时间的比率,设置越小则希望垃圾回收所占时间越小,CPU能花更多的时间进行系统操作,提高吞吐量

  • -XX:UseAdaptiveSizePolicy:参数开关,启动后系统动态自适应调节各参数,如-Xmn、-XX:SurvivorRatio等参数,这是和ParNew收集器重要的区别

  • GC日志关键字:PSYoungGen

  • 4、Serial Old(年老代)

  • 年老代收集器,可以和所有的年轻代收集器组合使用(Serial收集器的年老代版本)

  • 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

  • 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止

  • GC日志关键字:Tenured

  • 图示(Serial+Serial Old)

  • 5、Parallel Old(年老代)

  • 年老代收集器,只能和Parallel Scavenge组合使用(Parallel Scavenge收集器的年老代版本)

  • 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

  • 关注吞吐量的系统可以将Parallel Scavenge+Parallel Old组合使用

  • GC日志关键字:ParOldGen

  • 图示(Parallel Scavenge+Parallel Old)

  • 6、CMS(Concurrent Mark Sweep年老代)

  • 年老代收集器,可以和Serial、ParNew组合使用

  • 采用 ”标记-清除“算法,可以通过设置参数在垃圾回收时进行内存碎片的整理
    1、UserCMSCompactAtFullCollection:默认开启,FullGC时进行内存碎片整理,整理时用户进程需停止,即发生Stop The World
    2、CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full GC后,执行一个带压缩的(默认为0,表示每次进入Full GC时都进行碎片整理)

  • CMS是并发算法,表示垃圾回收和用户进行同时进行,但是不是所有阶段都同时进行,在初始标记、重新标记阶段还是需要Stop the World。CMS垃圾回收分这四个阶段
    1、初始标记(CMS Initial mark)    Stop the World   仅仅标记一下GC Roots能直接关联到的对象,速度快
    2、并发标记(CMS concurrent mark) 进行GC Roots Tracing,时间长,不发生用户进程停顿
    3、重新标记(CMS remark)          Stop the World   修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象的标记记录,停顿时间较长,但远比并发标记时间短
    4、并发清除(CMS concurrent sweep) 清除的同时用户进程会导致新的垃圾,时间长,不发生用户进程停顿

  • 适合于对响应时间要求高的系统

  • GC日志关键字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等

  • 缺点
    1、对CPU资源非常敏感
    2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收
    3、因为是使用“标记-清除”算法,所以会产生大量碎片

  • 图示

  • 7、G1

  • G1收集器由于没有使用过,所以从网上找了一些教程供大家了解

  • 并行与并发

  • 分代收集

  • 空间整合

  • 可预测的停顿

垃圾回收是什么意思

垃圾回收叫做GC:garbage collection,是java虚拟机JVM提供的一种内存回收方式。开发者在使用java开发的时候不需要像使用C/C++一样去手动释放内存,虚拟机会通过自动检测的方式,去释放内存。比如你用java new了一个对象,这个时候你得到了一个强引用,strong reference。当你不在需要这个对象的时候,你只需要把它设置成null。这个时候JVM并不会立刻回收掉这块内存,在之后的某个时间点,当JVM检测内存的时候发现这块内存已经没有任何强引用了,就会把它释放掉。

继续阅读
XML 地图 | Sitemap 地图