我想为运行时系统实现压缩垃圾收集器,该系统支持并行运行的多个线程,没有全局解释器锁。我的主要目标是实现简单性。可移植性不是一个重要的优先事项 - 我对只能在x86-64 Linux系统上运行的东西感到满意。
理想情况下,我希望我的记忆障碍就像mprotect()
正在收集内容或移动到其他地方的页面一样简单。如果这导致mutator中的页面错误,则mutator必须等到垃圾收集周期完成 - 我将设置一个SIGSEGV
处理程序来执行此操作。
但是,因为它是一个压缩收集器,当垃圾收集周期结束时,mutator试图操作的对象可能已被移动到其他位置。我需要一些方法来确保当mutator重新尝试操作对象时,它将使用对象的新内存地址,而不是旧内存地址。我该怎么做?
如果有帮助,这里是对象模型的描述。这个设计不是一成不变的,但它是一个很好的参考点。
内存分为正确对齐的64位字。每个对象都包含一个固定长度的标题(1个单词),后跟一个可变长度的主体。对象可以是标量或数组。
标量的标题词包含以下信息:
数组的标题字包含以下信息:
数组的元素本身就是标量,必须有自己的标题字。数组元素的对象大小必须与数组的元素大小一致。
数组切片或仅切片是数组对象中的连续元素范围。指向切片的指针由三个单词组成:
[from,to)
。指向数组的指针不能孤立存在 - 它们必须始终是指向切片的指针的一部分。这种设计有一些实际的后果:
O(1)
操作。