Windows和Windows上的内存页面写入检测Linux的

时间:2011-10-11 14:14:14

标签: c linux winapi garbage-collection memory-mapping

我目前正在研究一代分类垃圾收集器。这意味着只有最近的对象被遍历,幸存的对象(=从已知根可到达)被提升到老一代。当对象指向相同或较旧代的其他对象时,这可以正常工作。但是,当较旧的对象指向较新的对象时,并且由于仅遍历较新的对象,因此将错误地收集指向的对象。为避免这种情况,在每个GC阶段都会明确标记和遍历此类对象。

显然,这样的“父”对象是可变的,因为通过构造不可变的对象总是指向现有对象。因此,要成为“父”,必须在升级后修改对象,以便它指向更新的对象。

要知道老一代的哪些对象指向年轻一代,我正在寻找一种透明地监视内存变化的方法。为此,我使用内存保护和信号/异常处理。内存页面设置为只读,这会导致在写入时引发信号/异常,在这种情况下,我将内存保护设置回读写并将地址记录到某处以便进一步处理,并在返回时返回负责的代码因异常恢复正常。这样,当GC触发时,我知道在哪里寻找潜在的父母可以遍历。

在Linux上,我使用了mprotect / SIGSEGV信号处理的组合。在Windows上我打算使用VirtualProtect,但没有发现SIGSEGV处理的等价物。所以我的问题:

  1. 你会如何在Windows上做到这一点?异常处理API似乎相当混乱。

  2. 有没有更好的方法来了解哪些内存区域被修改,以便我不必进行所有这些记账?

  3. 我的代码是用简单的C语言编写的。目前我需要调用者代码来明确标记修改后的对象,但这很乏味且容易出错,所以我正在寻找一种透明的方法来实现它。

    先谢谢你,弗雷德

1 个答案:

答案 0 :(得分:3)

GetWriteWatch是理想的。 文档here