首页 > 编程知识 正文

jvm垃圾回收器g1,jvm垃圾回收过程

时间:2023-05-04 05:22:02 阅读:14929 作者:4375

回顾CMS 1.1堆内存结构

闪闪发光的计算机世代分为Eden区和两个survivor区。 古老的年代是连续的区域。

只有在完全GC的情况下,才可能发生内存整理。

1.2闪闪发光的电脑费GC

闪闪发光的电脑是淡绿色的,是古老年代的蓝色。 系统运行一段时间后,CMS堆内存可能分布在较早年代的各个位置,如下图所示。

闪闪发光的计算机代幸存者将从Eden区和survivor区复制到另一个空闲的survivor区。 minorGC年龄达到阈值的老对象升级到了老年代。

youngGC(minorGC )后,伊甸园区和一个survivor区被清空。

最近旧年代升级的对象用深蓝色表示。 绿色的对象是闪闪发光的电脑一代活着的对象。

1.3老一代通用汽车

在初始标记和重新标记阶段发生STW。 旧年代的剩余空间达到阈值时(发生Concurrent Mode Failure时)用串行old代替CMS进行旧年代的GC。

)1)初始标记停止时间短,简单地标记GCRoot参考的对象。 (2)同时标记标记生存对象时,APP应用程序继续执行。 (3)新标记阶段,标记合并阶段遗漏的生存对象。

未标记的对象将直接回收。 清扫完成后,释放了很多古老年代的空间。 同时,内存整理还没有发生,旧时代存在大量内存碎片。

最终,CMS经过复位阶段,等待下一个GC。

2.G1采集器2.1G1实现概述和使用场景的老式垃圾回收器(串行、并行、CMS )统一将java堆分为大小固定三部分:闪闪发光的计算机代、老年代和永久代。 所有内存对象最终都存储在这三个区域中。

G1收集器将所有java堆划分为大小相同的区域(region、1M-32M、最多2000个、最多支持64G堆内存)。 构成eden、survivor或old区域的一个或多个不连续区域不再固定大小,为内存APP应用程序提供了更大的灵活性。 G1垃圾收集过程与CMS相似。 在G1堆内存中同时标记所有对象,决定对象的可达性。 通过全局标记来了解和优先收集哪些区域几乎是空闲的,这是GarbageFirst名称的由来。 建立将G1垃圾回收和内存整理活动集中在几乎满是垃圾的区域,决定每个GC回收哪个区域以满足用户设定的停顿时间的停顿预测模型。

区域回收是通过复制算法实现的。 标签清理完成后,G1会将这些区域中的生存对象复制到一个单独的区域,以组织内存和释放空间。 该过程通过多线程并行执行来减少停顿时间,提高吞吐量。 因此,G1每次在GC中持续清洁碎片,控制暂停时间以满足用户的要求。 到目前为止虚拟机做不到。 只要CMS不清理内存碎片(除非通过虚拟机参数化每次或多次FullGC后进行整理),ParallelOld就会进行全堆整理,导致较长的休眠时间。

G1尽量低于用户设置的休眠时间目标,而不是实时垃圾收集器,但情况并非总是如此。 G1根据过去的垃圾收集监测数据预测每个地区的回收时间,根据用户设定的目标停止时间决定每个GC可以回收哪个地区。 G1这样,建立了比较准确的地区回收时间预测模型。

G1推荐的使用场景G1旨在为用户提供大内存、低GC休眠时间的APP应用解决方案。 这意味着堆内存大于或等于6G,停顿时间稳定小于0.5秒。

如果APP应用程序使用CMS或ParallelOld,并且面临以下问题,建议将APP应用程序迁移到G1

注意垃圾回收和内存管理暂停(0.5~1秒或更长)在APP应用程序中,FullGC频繁发生或总时间过长的对象的分配百分比,以及对象升级到较旧层代的百分比会发生很大变化G1不是最新JDK要求的虚拟机。

2.2GC 2.2.1闪闪发光的电脑费GC

存活对象将移动到一个或多个survivor区域。 对象到达晋升年龄后,将被移动到旧年代的区域。

闪闪发光的电脑费GC总结:

闪闪发光的电脑代收垃圾(youngGC )需要STW,所有APP应用线程必须停止。

youngGC多线程并行执行。

存活对象将复制到新的survivor区或旧的年代区。

2.2.2老年代GC

舞台上

说明

说明

初始标记

(Stop the world )

标记GC Roots直接引用的对象,闪闪发光的计算机代直接引用的较早年代的对象。

标记堆中所有生存的对象。 与使用者的APP应用程式同时执行。

在并发标记阶段,如果发现区域对象中的所有对象都是垃圾,则会在重新标记阶段立即回收该区域。

同时进行标记还会计算每个区域的对象活性(区域中生存对象的百分比)。

重新标记

(Stop the world )

由于修改标记阶段用户程序持续运行,标记已更改

动的那一部分标记记录

如果发现完全没有活对象的region就会将其回收到空闲列表。

 

清除

(Stop the world)

清点和重置阶段。

1)使用marking bitmap统计每个region被标记为活的对象有多少,统计每个区域的对象活性(区域中存活对象的比例)。

2)重置Remembered Sets

 

复制

(Stop the world)

将存活的对象复制到未使用的region中。

G1选择那些活跃度最低,回收速度最快的区域进行回收。

 

 

老年代GC总结 并发标记阶段 区域活跃度信息的统计与应用线程并发进行活跃度信息决定了那个区域最先在清理阶段被回收没有CMS的清理阶段再次标记阶段 SATB算法比CMS使用的算法更快空区域在这个阶段被回收复制/清理阶段 闪闪的电脑代和老年代同时被回收老年代根据活跃度确定回收优先级2.2.3 其他

Remembered Set(可认为是GC Roots的补充)

每一个Region都有一个对应的Remembered Set,里面记录了所有来自外部的引用,这些引用将被认为是GC roots的补充。

G1收集器中,Region之间的对象引用以及其他收集器中的闪闪的电脑代和老年代之间的对象引用是使用Remembered Set来避免扫描全堆。

G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序对Reference类型数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之间(在分代中例子中就是检查是否老年代中的对象引用了闪闪的电脑代的对象),如果是便通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set中。当内存回收时,在GC根节点的枚举范围加入Remembered Set即可保证不对全局堆扫描也不会有遗漏。

 

2.4 最佳实践 2.4.1 JVM参数

基本参数设置

启用G1 -XX:+UserG1GC
以下是使用G1收集器的javademo演示
java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar c:javademosdemojfcJava2DJava2demo.jar

关键参数设置

-XX:+UseG1GC - 启用G1-XX:MaxGCPauseMillis=200 - GC停顿的最长时间。这是一个软目标,即虚拟机会尽最大可能满足这一时间,但某些情况下仍可能超过。默认值为200ms。-XX:InitiatingHeapOccupancyPercent=45 - 堆内存使用率达到多少时启动一次GC过程。GC过程涉及整个堆内存,不单指某个年龄代。设为0时表示循环进行并发GC。默认值为45,即堆内存使用45%后触发一次GC。3.参考资料

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html  Getting Started with the G1 Garbage Collector

https://www.cnblogs.com/oldtrafford/p/6883796.html Getting Started with the G1 Garbage Collector(中文)

https://www.jianshu.com/p/74dd0ffd4386?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation Java垃圾回收手册(四):垃圾回收算法实现

http://blog.jobbole.com/109170/ 深入理解Java G1垃圾收集器

http://hllvm.group.iteye.com/group/topic/44381 高级语言虚拟机论坛 [资料] [HotSpot VM] 请教G1算法的原理

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。