java虚拟机 哈希表_深入理解java虚拟机 垃圾收集器

垃圾收集器

Serial收集器

1.最基本,发展最悠久

2.单线程垃圾收集器(必须暂停其他所有户用线程)

3.应用场景:客户端模式下的虚拟机(用户桌面应用场景、部分微服务应用)

ParNew收集器

1.多线程垃圾收集器

2.只有它能与CMS收集器配合工作

3.VM Args:-XX:ParallelGCThreads(限制垃圾收集的线程数(默认是处理器核心数))

Parallel Scavenge收集器

1.新生代收集器(标记-复制算法)、并行收集的多线程收集器

2.关注点:可控制的吞吐量(运行乎用户代码时间 / 运行用户代码时间 + 运行垃圾收集时间)

3.使用场景:后台运算的分析任务

4.VM Args

-XX:MaxGCPauseMillis(控制最大垃圾收集停顿时间)

-XX:GCTimeRatio(设置吞吐量大小,即垃圾收集占总时间的比率)

-XX:+UseAdaptiveSizePolicy(开启之后不需要设置新生代大小 -Xmn、Eden与Survivor的比例 -XX:SurvivorRatio、晋升老年代对象的大小 -XX:PretenureSizeThreshold)

Serial Old收集器

1.Serial 老年代收集器

2.与Parallel Scavenge搭配

Parallel Old收集器

Parallel Scavenge老年代收集器

CMS(Concurrent Mark Sweep)收集器

1.老年代收集器

2.四个阶段

初始标记(CMS initial mark):标记GC Roots能直接关联的对象,时间短,用户线程停顿

并发标记(CMS concurrent mark):GC Roots直接关联对象向下遍历整个对象图,时间长,不需要用户线程停顿

重新标记(CMS remark):为了修正并发标记期间,导致标记发生变动的对象标记记录,时间短,用户线程停顿

并发清理(CMS concurrent sweep):清理删除掉标记阶段判断已经死亡的对象

3.优点

并发收集

低停顿

4.缺点

对处理器资源要求高,并发处理会占用一部分线程(默认回收线程数:(处理器核心数量) + 3 / 4)

无法处理浮动垃圾(Floating Garbage):并发标记、并发清理阶段,用户线程一直在执行,会产生新的垃圾,需要预留一部分内存

预留内存不满足时,出现Concurrent Mode Failure:暂停用户线程, 启动Serial Old收集器

标记-清除算法,产生空间碎片

5.VM Args:-XX:CMSInitiatingOccupancyFraction(设置CMS触发内存百分比)

G1(Garbage First)收集器

1.服务端应用收集器(面向堆内存任何部分来组成回收集:Collection Set)

2.四个阶段

初始标记(Initial Marking):记录GC Roots直接关联到的对象,并修改TAMS指针

并发标记(Concurrent Marking):遍历整个GC Roots直接关联的对象下的对象图,并标记,重新处理SATB记录下并发标记过程中出现引用变动的对象

最终标记(Fianl Marking):补充SATB记录下并发标记过程中出现引用变动的对象

筛选回收(Live Data Counting and Evacuation):根据停顿预测时间来觉得回收多个Region区域

3.内存布局

独立区域(Region):每个Region赋予角色(新生代的Eden空间、Survivor空间、老年代空间),每个角色的Region采用不同的垃圾回收算法

TAMS(Top at Mark Strar)指针:每个Region单独划分出的一块空间,用于在并发回收过程中新对象的分配

Humongous Regoin:专门存储大对象(超过Region容量的一半)

4.问题

跨Region引用对象:使用记忆集(卡表)的方式,存储结构:哈希表(Key:别的Region的起始地址,Value:集合(卡表的索引号))

并发标记时收集线程与用户线程互不干扰:原始快照(SATB),TAMS(Top at Mark Strar)指针

可靠的停顿预测模型:衰减均值(Decaying Average)(个人感觉类似中位数),记录每个Region的回收耗时、每个Region记忆集里的脏卡数量,分析出平均值、标准偏差、置信度

5:VM Args

-XX:+UseConcMarkSweepGC(开启)

-XX:G1HeapRegionSize(设置Region的大小,2的N次幂)

-XX:MaxGCPauseMillis(设置允许的收集停顿时间)

低延迟垃圾收集器(Low-Latency Garbage Collector)

衡量垃圾收集器的指标

1.内存占用(Footprint)

2.吞吐量(Throughput)

3.延迟(Latency)

各款收集器的并发情况

Shenandoah收集器

1.回收阶段与用户线程并发执行

2.不适用分代收集:连接矩阵(Connection Matrix)二维表格

全局数据结构记录跨Region的引用关系,降低了维护每个Region记忆集的消耗,也降低了伪共享的概率。

3.九个阶段

初始标记(Initial Marking):标记与GC Roots直接关联的对象(停顿)

并发标记(Concurrent Marking):遍历与GC Roots直接关联的对象向下的对象图

最终标记(Final Marking):处理剩余的SATB扫描,统计出回收价值最高的Region(停顿)

并发清理(Concurrent Cleanup):清理没有存活对象的Region(Immediate Garbage Region)

并发回收(Concurrent Evacuation):不停顿,通过读屏障和转发指针(Brooks Pointers)解决并发情况下的移动对象的问题

初始引用更新(Initial Update Reference):确保所有并发回收阶段的收集器线程都已完成对象移动人物(线程集合点)(停顿)

并发引用更新(Concurrent Update Reference):更新所有指向旧对象的引用改为复制后的新地址

最终引用更新(Final Update Reference):修改GC Roots中引用地址的变更(停顿)

并发清理(Concurrent Cleanup):回收所有无存活对象的Region内存空间,供新对象分配使用

4.转发指针(Brooks Pointers)——类似于句柄访问对象

在对象前增加一个新的引用字段,不并发移动对象时,指向自己,并发移动时指向新地址的引用

多线程竞争:CAS

执行频率

ZGC收集器

1.Region内存布局,不设分代,使用读屏障、染色指针和内存多重影响实现可并发的标记-整理算法

2.内存布局:可动态创建和销毁,动态区域容量大小

小型Region(Small Region):2MB,存放小于256KB的对象

中兴Region(Medium Region):32MB,存放256KB-4MB的对象

大型Region(Large Region):存放4MB以上的大对象,每个region只存放一个大对象

4.染色指针(Colored Pointer)

标记信息记录在对象的指针上

对象的三色标记状态、是否进入了被移动过,是否只能通过finalize()方法才能访问

5.优势

存活对象被移动之后,该Region可以立即被释放和重用

减少在垃圾收集过程中内存屏障的使用

可扩展的的存储结构来记录更多与对象标记、重定位相关的数据

6.劣势(64位操作系统):

并不是所有的操作系统、处理器都支持,因为改变了内存的寻址地址

虚拟内存映射

7.四大阶段:

并发标记(Concurrent Mark):遍历对象图做可达性分析,标记阶段更新染色指针的Marked 0、Marked 1标志位。

并发预备冲分配(Concurrent Prepare for Relocate):统计出本次收集过程要清理的Region,并组成重分配集(存活对象被重新复制到其他Region,当前Region的释放,类卸载,弱引用处理)

并发重分配(Concurrent Relocate):

执行把预备阶段组成的重分配集中存活的对象复制到新的Region中

为重分配集中每个Region维护一个转发表,记录从旧对象到新对象的转向关系(用户线程并发访问位于重分配集中的对象时,被预置的内存屏障截获,根据转发表中的转向关系转发到新对象上,并同时修正该引用的值指向新对象)。

并发重映射(Concurrent Remap):修正整个堆中指向重分配集中旧对象的所有引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值