jvm 垃圾收集器(G1)
***************************
G1 简介
g1垃圾收集器对整个堆内存进行垃圾回收,将堆内存划分为多个 region,保留了新生代老年代的概念,有如下特点:
并行性:垃圾回收时,多个垃圾回收线程可同时运行
并发性:垃圾回收时,用户线程、垃圾回收线程可同时工作
空间整理:垃圾回收时,会进行对象移动,避免了空间碎片
可预见性:维护垃圾回收优先列表(回收空间、回收所需时间),优先对回收价值较大的region进行回收,停顿时间可控
***************************
垃圾回收过程:新生代垃圾回收、并发标记周期、混合回收、full gc
********************
新生代垃圾回收
新生代垃圾回收主要对eden、survivor进行垃圾回收;
垃圾回收前后,eden区清空,survivor区也会回收部分空间;
由于新生代的对象可能会进入老年区,老年区可能会增多
********************
并发标记周期
初始标记:标记从根节点直接可达的对象,在初始标记前会触发新生代垃圾回收,初始标记时用户线程停止运行
根区域扫描:标记survivor区直接可达的老年代对象,由于年轻代gc会改变survivor,因此这一阶段年轻代gc停止,但是用户线程可以正常工作
并发标记:扫描整个堆的存活对象并标记,此时可以进行年轻代gc,用户线程可以正常工作
重新标记:由于并发标记阶段用户线程可以运行,重新标记对标记结果进行修改,在重新标记前创建快照,加快重新标记进度,此时用户线程停止
独占预清理:按可回收空间大小对各区域进行排序并标记,供混合回收阶段回收,此时用户线程停止
并发清理:对没有存活对象的区域进行回收(若有存活对象则不回收,大部分回收在混合回收阶段进行)
eden区:初始标记前进行年轻代gc,eden被清空,由于回收期间用户线程可工作,并发标记周期后,仍会有eden区被使用;
G区:混合回收阶段被回收的区域
********************
混合回收阶段
并发标记周期会回收部分空间,大部分的垃圾回收工作会在混合回收阶段进行;
混合回收不一定回收全部标记为g的区域,只会优先回收可获得最大内存的几个区域
存活的对象会移动到其他空间,减少了空间碎片
混合回收会执行多次,直到回收足够的内存空间,然后触发新一次的年轻代gc,并发标记周期
full gc 触发条件
新生代回收阶段:新生代、老年代没有足够空间存储存活的对象
混合回收阶段:无法回收足够的内存空间存储对象
***************************
相关参数
-XX:+UseG1GC:使用g1垃圾收集器
-XX:MaxGCPauseMillis=value:gc停顿的最长时间
-XX:ParallelGCThreads=value:垃圾回收线程数
-XX:InitiatingHeapOccupancyPercent=value:堆使用率达到设定值时,触发并发标记周期,该值过大容易引发full gc,过小会频繁触发并发标记周期,该值默认为45