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