网站备案登记表,南京seo招聘,WordPress点击看大图,襄阳做淘宝网站推广1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1#xff08;Garbage First#xff09;垃圾回收器。 Parallel Scavenge关注吞吐量#xff0c;允许用户设置最大暂停时间 #xff0c;但是会减少年轻代可用空间的大小。 CMS关注暂停时间#xff0c;但是吞吐量方面会下降。 而G1…1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1Garbage First垃圾回收器。 Parallel Scavenge关注吞吐量允许用户设置最大暂停时间 但是会减少年轻代可用空间的大小。 CMS关注暂停时间但是吞吐量方面会下降。 而G1设计目标就是将上述两种垃圾回收器的优点融合 1.支持巨大的堆空间回收并有较高的吞吐量。 2.支持多CPU并行垃圾回收。 3.允许用户设置最大暂停时间。 JDK9之后强烈建议使用G1垃圾回收器。 G1垃圾回收器 – 内存结构
G1出现之前的垃圾回收器内存结构一般是连续的如下图 G1的整个堆会被划分成多个大小相等的区域称之为区Region区域不要求是连续的。分为Eden、Survivor、Old区。Region的大小通过堆空间大小/2048计算得到也可以通过参数-XX:G1HeapRegionSize32m指定(其中32m指定region大小为32M)Region size必须是2的指数幂取值范围从1M到32M。
G1垃圾回收有两种方式
⚫ 1、年轻代回收Young GC ⚫ 2、混合回收Mixed GC
G1垃圾回收器 – 年轻代回收
⚫ 年轻代回收Young GC回收Eden区和Survivor区中不用的对象。会导致STWG1中可以通过参数-XX:MaxGCPauseMillisn默认200 设置每次垃圾回收时的最大暂停时间毫秒数G1垃圾回收器会尽可能地保证暂停时间。 G1垃圾回收器 – 执行流程 1、新创建的对象会存放在Eden区。当G1判断年轻代区不足max默认60%无法分配对象时需要回收时会执行Young GC。 2、标记出Eden和Survivor区域中的存活对象 3、根据配置的最大暂停时间选择某些区域将存活对象复制到一个新的Survivor区中年龄1清空这些区域。 G1在进行Young GC的过程中会去记录每次垃圾回收时每个Eden区和Survivor区的平均耗时以作为下次回收时的参考依据。这样就可以根据配置的最大暂停时间计算出本次回收时最多能回收多少个Region区域了。比如 -XX:MaxGCPauseMillisn默认200每个Region回收耗时40ms那么这次回收最多只能回收4个Region。 G1垃圾回收器 4、后续Young GC时与之前相同只不过Survivor区中存活对象会被搬运到另一个Survivor区。 5、当某个存活对象的年龄到达阈值默认15将被放入老年代 6、部分对象如果大小超过Region的一半会直接放入老年代这类老年代被称为Humongous区。比如堆内存是4G每个Region是2M只要一个大对象超过了1M就被放入Humongous区如果对象过大会横跨多个Region。
G1垃圾回收器 – 混合回收
7、多次回收之后会出现很多Old老年代区此时总堆占有率达到阈值时 -XX:InitiatingHeapOccupancyPercent默认45%会触发混合回收MixedGC。回收所有年轻代和部分老年代的对象以及大对象区。采用复制算法来完成。 G1垃圾回收器 – 混合回收 ⚫ 混合回收分为初始标记initial mark、并发标记concurrent mark、最终标记remark或者Finalize Marking、并发清理cleanup ⚫ G1对老年代的清理会选择存活度最低的区域来进行回收这样可以保证回收效率最高这也是G1Garbage first名称的由来。 ⚫ G1对老年代的清理会选择存活度最低的区域来进行回收这样可以保证回收效率最高这也是G1Garbage first名称的由来。最后清理阶段使用复制算法不会产生内存碎片。
G1垃圾回收器 – FULL GC
注意如果清理过程中发现没有足够的空Region存放转移的对象会出现Full GC。单线程执行标记-整理算法此时会导致用户线程的暂停。所以尽量保证应该用的堆内存有一定多余的空间。 G1 – Garbage First 垃圾回收器 参数1 -XX:UseG1GC 打开G1的开关 JDK9之后默认不需要打开 参数2-XX:MaxGCPauseMillis毫秒值 最大暂停的时间