一键采集上传常见的细节问题(HotSpot算法细节发起内存回收安全点如何选取实现方案安全)

优采云 发布时间: 2021-11-20 15:06

  一键采集上传常见的细节问题(HotSpot算法细节发起内存回收安全点如何选取实现方案安全)

  HotSpot算法细节发起内存回收的安全点

  如何选择安全点

  实施计划

  

  安全区

  问题

  解决

  加速内存标签根节点枚举

  问题

  解决方法(OopMap其实就是汇编指令中的一条记录,该记录收录了参与操作的对象指针)

  OopMap 示例

  反编译 String::hashCode() 方法的原生代码

  

  当心

  并发可达性分析

  问题

  主流编程语言的垃圾采集器基本都是依靠可达性分析算法来判断对象是否存活。可达性分析算法理论上要求整个过程都基于一个可以保证一致性的快照,然后才能进行分析。这意味着用户线程必须一直冻结。

  三色标记算法

  目的:

  过程

  

  用户线程和采集器是并发标记问题

  解决了“对象消失”的问题(以下针对标记阶段并发遍历后的最终标记阶段的策略。本步骤的最终标记完成后,新添加的节点不会被颜色标记,也就是要等到下一个新添加的部分才在垃圾回收时标记)

  求值器删除所有从灰色对象到白色对象的直接或间接引用

  解决并发扫描时对象消失的问题,只需要销毁这两个条件中的任意一个即可。

  原创快照

  原创快照要销毁的是第二个条件。当灰色对象要删除与白色对象的引用关系时,记录要删除的引用。并发扫描结束后,记录引用关系。灰色对象是根,再次扫描。这也可以简化为,无论是否删除引用关系,都会根据扫描刚开始时的对象图的快照进行搜索。

  加速内存扫描内存集和卡表

  问题

  记录集准确度

  在垃圾采集场景中,采集器只需要通过内存集来判断某个非采集区是否有指向采集区的指针,不需要知道这些代际指针的所有细节。设计者在实现内存集时,可以选择更粗略的记录粒度,以节省内存集的存储和维护成本。

  完成

  写屏障

  问题

  完成

  写屏障可以看作是虚拟机层面的“引用类型字段分配”动作的AOP方面。当引用对象被赋值时,会产生一个Around通知,让程序执行额*敏*感*词*内。

  /**

* 写后屏障更新卡表

*/

void oop_field_store(oop* field, oop new_value) {

// 引用字段赋值操作

*field = new_value;

// 写后屏障,在这里完成卡表状态更新

post_write_barrier(field, new_value);

}

  虚假分享

  为了避免假共享问题,一个简单的解决办法是不使用无条件写屏障,而是先检查卡表标记,只有在没有被标记时才将卡表元素标记为脏,即更新卡片表。逻辑变成如下代码所示:

  if (CARD_TABLE [this address >> 9] != 0)

CARD_TABLE [this address >> 9] = 0;

  在JDK 7之后,HotSpot虚拟机新增了一个参数-XX:+UseCondCardMark,用于判断是否开启卡表更新的条件判断。开启会增加额外判断的开销,但是可以避免误共享的问题。两者都有性能损失。是否开启应根据应用的实际运行情况进行测试和权衡。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线