2026/4/6 7:48:27
网站建设
项目流程
制作公司内部网站,国外超酷网站,建视频网站需要多大空间,新乡seo顾问微观标记复制#xff0c;整体上标记整理
假设堆被分成10个Region#xff0c;每个Region用括号表示#xff0c;里面是对象的状态#xff1a;L表示存活对象#xff0c;G表示垃圾#xff0c;E表示空闲。
初始状态#xff1a;堆中有存活对象和垃圾#xff0c;分布比较零散。…微观标记复制整体上标记整理假设堆被分成10个Region每个Region用括号表示里面是对象的状态L表示存活对象G表示垃圾E表示空闲。初始状态堆中有存活对象和垃圾分布比较零散。Region: 0 1 2 3 4 5 6 7 8 9[L] [G] [L] [G] [E] [L] [G] [L] [G] [L]G1会选择一个回收集比如Region1,3,6,8这些Region的垃圾比例高。注意G1的选择是基于“回收价值”的这里我们假设这几个Region的垃圾最多。微观复制将回收集Region1,3,6,8中的存活对象复制到空闲Region比如Region4但注意复制过程中可能会使用多个空闲Region这里为了简单假设全部复制到Region4实际上会按顺序使用空闲Region。复制后回收集中的存活对象被复制到了新的Region同时这些回收集被清空变成空闲Region。复制过程Region1: 没有存活对象全是垃圾所以直接清空变成空闲。Region3: 没有存活对象直接清空。Region6: 没有存活对象直接清空。Region8: 没有存活对象直接清空。实际上如果有存活对象就会复制到空闲Region。但在这个例子中我们假设这些Region全是垃圾所以没有复制操作直接清空。回收后的状态Region: 0 1 2 3 4 5 6 7 8 9[L] [E] [L] [E] [E] [L] [E] [L] [E] [L]现在我们看到空闲Region变多了1,3,6,8而且它们是分散的。但是请注意存活对象仍然分散在0,2,5,7,9。接下来G1会继续选择回收集比如Region0,2,5,7,9假设它们现在垃圾比较多但实际上这里存活对象多垃圾少所以可能不会选它们这里为了演示整体整理的效果我们假设又经过了多次回收每次回收都选择垃圾最多的Region并将存活对象复制到空闲Region。假设经过多次回收后存活对象被逐渐复制到堆的一侧空闲Region集中在另一侧。最终状态可能如下Region: 0 1 2 3 4 5 6 7 8 9[L] [L] [L] [L] [L] [E] [E] [E] [E] [E]这样我们就看到整体上存活对象被整理到了堆的前半部分后半部分是大块连续的空闲空间。这就是整体上的标记-整理效果。但是这个整理过程不是一次完成的而是通过多次的复制回收微观复制逐步完成的。所以总结一下微观每次回收将选中Region回收集的存活对象复制到空闲Region然后清空回收集。这是复制算法。整体经过多次回收存活对象被逐渐移动并紧凑地放在一起形成连续的存活对象区域和连续的空闲区域。这是标记-整理的效果。Region的堆内存布局G1不再坚持固定大小以及固定数量的分代区域划分而是把连续的Java堆划分为多个大小相等的独立区域Region每一个Region都可以根据需要扮演新生代的Eden空间、Survivor空间或者老年代空间高吞吐量与低延迟的平衡低延迟指单次垃圾回收事件导致的“Stop-The-World”停顿时间非常短。吞吐量指的是应用程序运行时间占总运行时间的比例。高吞吐量策略通常意味着更少的GC总时间更多时间运行应用但可能单次停顿时间较长低延迟策略通常意味着更短的每次停顿时间但可能需要更频繁的GC总GC时间可能增加通过分区回收 停顿预测可预测的停顿时间模型优先处理回收价值收益最大的那些Region四个步骤总结G1旨在为大内存、多核CPU的现代服务器应用提供可预测的、相对较短的停顿时间同时保持较高的吞吐量它通过Region化分区、停顿时间预测模型和增量式并发回收机制在大堆内存管理上取得了吞吐量与延迟的最佳平衡。