jvm 垃圾收集器(G1)


jvm 垃圾收集器(G1)

***************************

g1 简介

      

g1垃圾收集器对整个堆内存进行垃圾回收,将堆内存划分为多个 region,保留了新生代老年代的概念,有如下特点:

并行性:垃圾回收时,可有多个垃圾线程同时运行,提升了回收效率

并发性:垃圾回收期间,可与用户线程同时工作

空间整理:g1垃圾回收时,会进行对象移动,避免了空间碎片

可预见性:g1会优先回收可获得较大内存的region,不会对所有的region进行回收,减少了垃圾回收的停顿时间

***************************

垃圾回收过程:新生代垃圾回收、并发标记周期、混合回收、full gc

********************

新生代垃圾回收

      

新生代垃圾回收主要对eden、survivor进行垃圾回收;

垃圾回收前后,eden区清空survivor区也会回收部分空间

由于新生代的对象可能会进入老年区,老年区可能会增多

********************

并发标记周期

      

初始标记:标记从根节点直接可达的对象,在初始标记前会触发新生代垃圾回收,初始标记时用户线程停止运行

根区域扫描:标记survivor区直接可达的老年代对象,由于年轻代gc会改变survivor,因此这一阶段年轻代gc停止,但是用户线程可以正常工作

并发标记:扫描整个堆的存活对象并标记,此时可以进行年轻代gc,用户线程可以正常工作

重新标记:由于并发标记阶段用户线程可以运行,重新标记对标记结果进行修改,在重新标记前创建快照,加快重新标记进度,此时用户线程停止

独占预清理:按可回收空间大小对各区域进行排序并标记,供混合回收阶段回收,此时用户线程停止

并发清理:对没有存活对象的区域进行回收(若有存活对象则不回收,大部分回收在混合回收阶段进行)

      

eden区:初始标记前进行年轻代gc,eden被清空,由于回收期间用户线程可工作,并发标记周期后,仍会有eden区被使用;

G区:混合回收阶段被回收的区域

********************

混合回收阶段

      

并发标记周期会回收部分空间,大部分的垃圾回收工作会在混合回收阶段进行;

混合回收不一定回收全部标记为g的区域,只会优先回收可获得最大内存的几个区域

存活的对象会移动到其他空间,减少了空间碎片

            

混合回收会执行多次,直到回收足够的内存空间,然后触发新一次的年轻代gc,并发标记周期

********************

full gc

触发条件:如果新生代回收时,survivor和老年代无法存储存活的对象;混合回收阶段无法回收足够的内存空间

***************************

相关参数

-XX:+UseG1GC:使用g1垃圾收集器

-XX:MaxGCPauseMillis=value:gc停顿的最长时间

-XX:ParallelGCThreads=value:垃圾回收线程数

-XX:InitiatingHeapOccupancyPercent=value:堆使用率达到设定值时,触发并发标记周期,该值过大容易引发full gc,过小会频繁触发并发标记周期,该值默认为45

发布了387 篇原创文章 · 获赞 98 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43931625/article/details/105090300
今日推荐