堆仍然有新生代(eden、survivor)、老年代的划分,但是不再要求它们是内存连续的。每个区都由多个region组成。
部分老年代region存储humongous对象(即下图的h),这种对象大小大于等于region的一半。
(图片来源-java hotspot g1 gc的一些关键技术)
全称snapshot-at-the-beginning,起始时活对象的快照。在理解satb前需要先了解以下知识。
cms和g1的算法都是通过对gc root 进行遍历,并进行三色标记。标记规则为
并发扫描时,对于白色有两种情况同时发生时,可能会漏标导致被误回收:
具体执行过程:
按照r大的说法:cms的incremental update设计使得它在remark阶段必须重新扫描所有线程栈和整个young gen作为root;g1的satb设计在remark阶段则只需要扫描剩下的satb_mark_queue。
全称remember set,记录一个region里的对象被哪些其他region引用。
相对应地,有另一种辅助数据结构collection set(cset),它记录了gc要收集的region集合。gc时只需扫描cset中各个rset即可。
(tips for tuning the garbage first garbage collector)
更详细的访问机制和回收过程这里不再展开,有兴趣可以参考后文引用文献。
暂停预测模型,g1根据它计算出的历史数据来预测本次收集需要选择的region数量,从而尽量满足用户设定的目标停顿时间。
具体算法和公式略,可见java hotspot g1 gc的一些关键技术
分为以下几步:
作为对比,cms的回收过程
如对本文有疑问, 点击进行留言回复!!
NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser androi
关于启动appium-desktop,报错:Cannot extract apk info using apkanalyzer. Falling back to aapt. Original ....
Gradle 发布共享库——如何通过Gradle发布Android依赖库(aar)到 jitpack 公共仓库
Gradle 发布共享库——如何通过Gradle发布java依赖库(jar)到 jitpack 公共仓库(—)
网友评论