jvm打破砂锅问到底- 为什么要标记或记录跨代引用

  1. 为什么要标记或记录跨代引用.
    ygc时, 直接把老年代引用的新生代对象(可能是对象区域)记录下来当做根, 这其实就是依据第二假说和第三假说, 强者恒强, 跨代引用少(存在互相引用关系的两个对象,是应该倾
    向于同时生存或者同时消亡的).

拿ygc老年代跨代引用对象当做根, 首先就免去了直接直接扫描老年代, 因为要遍历标记哪个新生代的对象存活, 必须从根开始找, 那假如新对象是通过老对象关联着根的, 这种情况是根可达. 这意味着要访问完所有老年代对象以及他的引用关系, 才能枚举刚才的根可达情况. 这显然很耗时, 这就是在fullgc遍历. 因此记录跨代引用就是为了避免这种情况. 造成的好处就是不用罗列根可达对象们的时候, 只用在新生代区域进行就行了, 不用管老年代对象, 免去其判断. 将这判断交给跨代引用的维护. (空间换时间), 这样ygc停顿时间是较短的

(是以下两条的讨论, 第一:弱分代假说: 弱者居多, 弱者就是指朝生夕死,

第二: 强分代假说: 强者恒强, 一个对象如果能持久一段gc次数而不消亡, 他突然消亡的可能性就很小, 或者说越难以消亡)

相关推荐
2401_832365523 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
2301_779622413 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_766283443 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
zh1570238 小时前
如何编写动态SQL存储过程_使用sp_executesql执行灵活查询
jvm·数据库·python
2401_824222698 小时前
SQL报表统计数据量巨大_分批统计策略
jvm·数据库·python
X56618 小时前
mysql如何处理连接数过多报错_调整max_connections参数
jvm·数据库·python
m0_609160499 小时前
MongoDB中什么是Hashed Shard Key的哈希冲突_哈希函数的分布均匀性分析
jvm·数据库·python
2401_8330336211 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
m0_6245785911 小时前
JavaScript 中高精度小数(20位以上)的正确处理方法
jvm·数据库·python
m0_7403524211 小时前
如何用 Symbol 作为对象属性键名防止第三方库属性覆盖
jvm·数据库·python