首页 > 编程知识 正文

g1垃圾回收算法,g1垃圾收集器优缺点

时间:2023-05-03 10:32:18 阅读:15006 作者:2681

G1(GarbageFirst )收集器是甲骨文公司开发的主要面向面向服务方向的具有可靠姿势预测模型的垃圾收集器。 垃圾收集器的历史具有里程碑式的意义。 jdk9或更高版本将被设置为服务器端的默认垃圾收集器。

与以往的采集器不同,G1使用的不是基于固定新生代和老年代的内存分配方式,而是基于Region的内存分配方式。 这样,G1就不需要处理整个generation代、旧代甚至整个Java堆的垃圾,大大减少了标记时间。

设计思路面向局部(Region )收集

存储器布局基于Region的存储器布局形式

Region (域) G1将Java堆划分为多个大小相同的区域。 每个区域都是Region,收集器在处理垃圾时以Region为单位进行。 另外,为了更好地分配大对象,G1设计了Humongous的特殊Region。 对象大小(通常是单个Region的一半大小)在达到一定阈值时指定给此处,而一些更大的对象)在超过单个Region的容量时指定给连续的Humongous。

对象之间的交叉Region引用通过内存集的实现进行处理。 G1收集器为每个Region维护一个内存集。 这些内存集本质上是存储结构的哈希表,包含每个Region的起始地址和相应的卡表索引号。 但是,由于Region的数量很多,每个Region都需要保留一个内存集,因此G1收集器在工作时会占用Java堆的资源,约为10-20%

同时标注主要有两种方法。 1 .增量更新; 2 .原始快照。

G1收集器使用了原始快照方法。 由于用户线程仍在进行中,因此很可能会创建新对象。 为了便于维护,G1为每个Region设置一个顶层标记开始指针(tams ),提取该Region的部分空间以存储新对象,并将在并发标记期间创建的对象分配给此处此外,如果内存回收速度低于内存分配速度,G1收集器将强制冻结用户线程并执行一次Full GC。 这样,用户线程将长时间停止。

可靠的姿态预测模型姿态预测模型建立在衰减平均的理论基础上。 之所以强调衰减,是因为对新信息更敏感,能很好地反应最近的平均状态。 统计状态越新,Region的回收价值越明显,根据这些信息可以预测下次的垃圾回收。

停顿预测模型意味着可以支持将长度指定为m毫秒的时间段,并且垃圾收集所使用的时间不超过n毫秒的概率高的目标。 《深入理解Java虚拟机》

进行垃圾回收时,G1收集器统计各Region的状况,据此计算出哪个Region的回收率更高,将这些高收益率的Region合并为一个回收进行垃圾回收。

由垃圾收集G1收集器进行的垃圾收集过程分为四个过程:

1 .初始标记遍历并标记与GCRoots直接相关的对象,并更改TAMS指针的值。 在此过程中,用户线程将暂停

2、并发标记从GCRoots对Java堆的对象进行可达性分析,找出需要回收的对象进行标记。 此过程需要很长时间,但可以与用户线程同时运行。 标记完成后,还可以执行重新扫描在并发期间引用发生更改的对象的标记。

3、最终标记处理同时标记阶段结束后剩余参照仍有变更的对象记录。 在此过程中,用户线程将暂时停止。

4、分拣回收通过对各Region进行统计,计算出哪些Region可以回收,回收组合可以获得较高的收益,并记录下这次的统计信息,从而在下次回收垃圾时可以根据这些信息预测这些Region的回收收益此进程的用户线程将被暂停。

关于G1,G1在许多收集器中凭借基于Region的存储器布局和可靠的姿势预测模型而与众不同。 基于Region的存储器布局方案使G1在垃圾收集时更高效,但可靠的姿势预测模型允许G1将姿势时间抑制在用户期望的时间内。 当然,这个时间不能太短。 否则,每次只收集少量垃圾,垃圾收集的速度赶不上对象的分配速度,发生Full GC,最终程序执行效率降低,系统吞吐量降低。 同时G1的内存、cpu等资源占有率也很高,这也是G1的不足之处。

对于收集器选择,没有完美的虚拟机。 再好的虚拟机也有几个不好的地方。 在某些方面突出,要么接受其他方面的不足,要么采用折中的思想,虽然没有一些突出的特点,但也没有不好的一面。

因此,选择合适的采集器,关键是看用途、服务领域、人群,应该因地制宜,还有人可以优化控件的具体虚拟机参数。

第一次写的时候,感觉逻辑有点混乱,就想着要写什么。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。