首页 > 编程知识 正文

jvm垃圾回收器有哪几种,g1回收器的优点

时间:2023-05-06 00:28:17 阅读:14943 作者:4884

在谈论Oracle为指定的JDK 7建立项目目标的G1垃圾收集器之前,G1垃圾收集器可以了解G1垃圾收集器的背景知识。 到JDK 7更新4为止被认为达到了商用水平。 Oracle公式中也被称为“全功能垃圾收集器”。

G1的区域划分G1主要是面向服务端APP应用的垃圾收集器,为收集器的局部采集创造了设计思路和基于Region的内存布局形式。 垃圾回收的范围可以针对堆内存的任何部分配置重新收集,而不是针对整个新一代或上一代。 哪些内存中存储了最多的垃圾回收,回收利润最大的是回收该块。 这就是G1收集器的混合GC模型。

G1并不坚持固定大小和固定数量的分代区域划分,而是将连续的Java堆划分为多个相同大小的独立区域(Region )。 每个Region都可以根据需要扮演新生代的Eden空间、Survivor空间或古老的年代。

G1的回收构想G1通过建立可预测的停顿时间模型被回收。 这是因为将Region作为一次回收的最小单位。 也就是说,每次收集的内存空间是Region大小的整数倍,可以有计划地避免整个Java堆中所有区域的烦人的手机。 这通过跟踪各区域中垃圾堆积的“价值”的大小、价值,即回收得到的空间大小和回收所需时间的经验值,在后台维持优先顺序列表,每当用户设定允许的收集停止时间时

但另一个问题是Region上存在跨Region引用对象。 怎么解决? 它作为GC Roots扫描避开所有堆,在内存集合中记录另一个Region指向自己的指针,并标记这些指针分别位于哪个卡页的范围内。 G1的内存集本质上是存储结构的哈希表,Key是另一个Region的起始地址,Value是集合,其中存储的元素是卡表的索引号。 该“双向”的牌桌结构(牌桌是“我指的是谁”,该结构中还记录了“谁指的是我”。 因为Region的数量比传统收集器的分代数量多。 因此,G1有更高的内存占用负担。并发标记阶段如何确保收集线程和用户线程在不相互干扰的情况下运行? 首先要解决的问题是,用户线程在更改对象引用关系时,必须保证不破坏原始的对象图结构,标记结果会出现错误。 为每个Region设计两个指针“TAMS”,将Region中的部分空间分割出来,用于并行回收期间的新对象指定。 同时回收时新分配的对象地址必须同时位于两个指针位置。 缺省情况下,G1收集器在此地址以上的对象由ttdxtz标记。 也就是说,它默认生存,不属于回收范围。

G1收集器的工作过程大致可分为以下四个步骤:

33558 www.Sina.com/:标记与gcroots直接关联的对象,更改TAMS指针的值,以便在下一阶段的用户线程同时运行时,新对象将正确指向可用的Region 3358 www.Sina.com/:从gcroot启动堆中对象的可达性分析,递归扫描整个堆的对象图以找到要重用的对象。 虽然这个阶段很费时间,但是它可以与用户程序同时运行,并且使用原始快照实现了标记阶段的同时运行。初始标记:暂停用户线程并处理并发会话结束后剩下的最后少量SATB记录。 33558 www.Sina.com/:负责更新Region统计数据,排列每个Region的回收价值和成本,并根据用户期望的停机时间指定回收计划。 您可以选择多个Region配置回收,将决定回收的区域的Region库存目标复制到空Region中,然后清除整个旧Region。在此,您必须暂停用户线程。

以上是我对G1垃圾收集器的简单理解。 G1它不追求一次清理整个Java对,而是追求能够支持APP应用程序的内存分配速度。 以这种方式分配APP应用程序,同时收集收集器。 如果收集速度能跟上对象分配速度,一切都会如预期那样。

摘要G1也是一个收集器,可以使用Region概念来划分java堆空间,并解析Region之间引用的对象。 解决收集线程和用户线程不相互干扰,这取决于TAMS指针。 接下来我会总结很多关于JVM的知识。 也不能只学习专业知识。 也要注意沟通,珍惜说话、理解、珍惜的人,我们不能只在乎自己的感受。

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