实时Java中基于区域的内存管理解析
1. 垃圾回收与写屏障相关解决方案
在实时Java(RTSJ)的内存管理中,有一个利用名称代码和二进制掩码支持写屏障检查的可预测时间的解决方案。该方案基于区域在创建时就确定父子关系的思想,但它所提供的内存模型灵活性不如RTSJ的内存模型。不过,它的优势在于使用和实现都具有确定性和简单性。
在使用基于写屏障的垃圾回收器(GC)时,检测内存访问错误的读屏障并非严格必要。因为读操作不会改变对象的颜色,所以不会影响GC的一致性。对于关键任务的限制可以简化为只进行写屏障检查,因为读操作不会干扰GC图,并且堆内的对象也不会被重新分配。如果使用的是非移动收集器(即不基于复制且不进行压缩),则可以避免使用读屏障。而对于基于复制或压缩的GC,必须使用句柄来指向堆内分配的对象,以方便重定位并保持写屏障使用的透明性,替代读屏障。对于需要重定位但不使用句柄的移动GC(如HotSpot JVM),则需要读屏障。
这里采用了与增量GC相同的优化策略,即使用写屏障代替读屏障。在这种情况下,当关键任务尝试访问堆内对象v时抛出的 MemoryAccessError() 异常,被替换为当关键任务尝试创建对属于堆的对象Y的引用时抛出的 IllegalAssignment() 异常。对于非关键任务,从红色对象到堆内对象(非红色)的引用会将v对象添加到收集器的根集;而对于关键任务,对非红色对象(白色、黑色或灰色)的引用会导致 MemoryAccessError() 异常。这种修改虽不符合RTSJ规范,但引入了约6%的重要性能提升(执行的字节码中11%执行加载操作,5%执行存储操作)。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



