新生代垃圾回收器
serial 单线程回收,用户线程需要停止
PN多线程回收,用户线程需要停止
PS 1.多线程回收,用户线程需要停止,2.以高吞吐量标准设计的:用户线程时间/(用户线程时间+垃圾回收时间)
老年代垃圾回收器
serial-old 老年代的单线程垃圾回收,用户线程需停止
PS-old老年代多线程回收,用户线程需需要停止,以高吞吐量为原则设计
CMS多线程回收,以用户线程暂停时间最短为设计标准,回收的时候,用户线程有一段时间不需要停止
G1回收器
特点:
垃圾回收的时候几乎没有stop the world时间
新生代、老年代都可以回收
可将内存分为多个大小相同的region区域,根据区域之间使用标记-整理算法,区域内部使用标记复制算法;
可预测垃圾回收时间
对region区域做选择性回收,回收价值高的region区域
过程
1.初始标记:停顿所有的用户线程,标记各个region区域中能被gcroot关联到的对象
2.并发标记:用户线程和GC线程并行,gc线程根据可达性分析算法找出存活的对象
3.最终标记:停顿用户线程,并发执行gc线程去标记刚才用户线程操作引用对象的那部分内存
4.筛选标记:根据可停顿时间,计算出最优的region区域,并发的对最优的区域进行垃圾回收。(用户线程和gc线程是可以并发的)
分区region
将Java的堆内存分为2048个大小相同的region快
region大小特点
每个region区域的大小都是2的N次幂;即1MB,2MB,4MB
region区域大小在jvm运行期间都不会被改变
每个region区域的大小都是相同的
存储特点
每一个region区域只会属于Eden,survivor、old其中的一种
新增一种新的内存区域,humongous内存区域,超过0.5个region对象就会被放Humongous区域。
Eden、survivor、老年代的区域并不是连续的
三个过程
Young GC
Mixed GC
Full GC
G1回收器缺点
G1回收器本身运行垃圾回收程序时相对cms垃圾回收期需要占有更多的系统CPU、内存资源
在内存小于6g时,cms表现优于G1,大于8g,G1回收器更好,6-8g之间,差不多
相关参数
-XX:G1HeapRegionSize 设置region区域大小
-XX:+UseG1GC 手动设置G1垃圾回收器;jdk1.9默认就是G1
-XX:MaxGcPauseMillis