java humongous_JVM G1

设计架构的重要思想

分治

分层

a37dd5ac627669e4405f41a6869a7717.png

吞吐量G1比PS降低10%~15%

追求耗时少,200ms内有响应,用G1

追求throughput,用Parallel

G1原理模型

bb81a81ed3c370039a881b6626a9192e.png

humongous object

超过单个region50%

c5db6e596bc89444d237ea3b35c56a3d.png

GC何时触发

YGC

Eden空间不足

多线程并行执行

FGC

Old空间不足

system.gc()

G1特点

并发收集

压缩空闲空间不会延长GC的暂停时间

更易预测的GC暂停时间

适用不需要实现很高的吞吐量的场景

动态新老年代比例:5%~60%,不需要手工指定

G1预测停顿时间的基准

Card Table

08a0e267f3665a8a994d82cc8b78c3dc.png

YGC的时候,需要扫描整个Old区域,效率非常低,所以Jvm设计了CardTable

如果一个CardTable中有对象指向Y区,将其设置为Dirty,下次扫描时,只需要扫描Dirty的Card Table

在结构上,Card Table用Bitmap实现

G1的内存区域不是固定的Eden或者Old

c2be7e3eeba4c4030dcbf6256884a670.png

G1基本概念

CSet

CSet = Collection Set

一组可被回收的分区的集合

在CSet中存活的数据会在GC过程中被移动到另一个可用分区

CSet中的分区可以来自Eden空间、survivor空间或者老年代

Cset会占用不到整个堆空间的1%大小

Rset

RememberedSet(G1高效回收的关键)

Region中都有一个HashSet(Rset),记录其他对象对本对象的引用

回收高效,占用空间变大,空间换时间

23218df038b6444b323c56b80fb53d0d.png

G1中的MixedGC

相当于一个CMS

XX:InitiatingHeapOccupacyPercent

默认值45%

当O超过这个值时,启动MixedGC

MixedGC过程

初始标记stw

并发标记

最终标记(重新标记)

筛选回收stw(并行)

初始标记

5cf72bb7b6c20c5d84726d8d597da8f2.png

并发标记

c5d8fba0dc4dbe1baf0c0c25fde3ca09.png

最终标记

5d5daeb16f070b4208d7453953093d56.png

并行筛选回收(筛选垃圾最多的region进行回收)

a59ea7dfa50d2e98435649e2b1c4cd9c.png

如果G1产生FCG,应该怎么做

扩内存

提高CPU性能(回收得快,业务逻辑产生对象速度固定,垃圾回收快,内存空间大)

降低MixedGC触发的阈值,让MixedGC提早发生(默认45%)

阿里多租户Jvm

每租户空间

session based GC

并发标记算法

在标记对象过程中,对象的引用关系正在发生改变

三色标记

白色,未被标记的对象

灰色,自身被标记,成员变量未被标记

黑色,自身和成员变量均已标记完成

ca0d140a67f600a84b73b8d1da75b8c4.png

漏标

924e2ef778bf51581db6f8c000011d78.png

A指向D,B指向D的引用消失了

2e0528cbc6e491c5b832861e0836a2fd.png

产生漏标

漏标指的是,live object,由于没有遍历到,被当成garbage回收

标记进行时增加了一个黑到白的引用,如果不重新处理黑色,会漏标

标记进行时删除了灰对象对白对象的引用,这个白对象可能被漏标

漏标解决方法

incremental update(CMS采用方案)

增量更新,关注应用的增加,把黑色重新标记为灰色,下次重新扫描属性

SATB snapshot at the beginning(G1采用方案)

关注引用删除,当B->D消失时,要把这个引用推到GC的堆栈,保证D还能被GC扫描到

为什么G1使用SATB

灰色->白色,引用消失时,如果没有黑色指向白色

引用会被push到堆栈,下次扫描时拿到这个引用,由于RSet的存在

不需要扫描整个堆区查找指向白色的引用,效率比较高

SATB配合RSet,完美搭配

Rset与赋值效率

由于RSet的存在,每次给对象赋引用时候,就得做一些额外操作

在Rset中做一些额外的记录(在GC中称为写屏障)

写屏障(不是内存屏障)

No Sivler Bullet

原文:https://www.cnblogs.com/YC-L/p/14418930.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值