我已经阅读了有关不同类型的GC以及它们的工作原理的相关内容。所有类型的GC都涉及遍历可能被回收的内存集合,但是我所读到的内容并没有给出实际操作的指示。下面这样的操作是否完全偏离了正确方向?
void* myAlloc(size_t size)
{
if (needToGc())
gc();
void* obj = malloc(size);
if (!obj)
outOfMemory(); // or maybe GC and try once more
*alloced = obj;
*alloced = *alloced + 1;
return obj;
}
void gc()
{
// go through memory pointed to in `alloced`
}
我猜是这样,但这是我能想到的唯一解释...
malloc
把内存放在哪里。对于建立在malloc
之上的 gc,myAlloc
可能需要跟踪分配的块,因为当它们变得不可达时,gc 需要将它们传递给free
。但是它可以使用比数组更好的数据结构。如果 gc 知道 malloc 的实现方式,它可以直接修改堆以标记不可达块为可用状态,然后myAlloc
就不需要跟踪任何东西了。gc 知道从根节点遍历什么。 - Gilles 'SO- stop being evil'malloc
之上的垃圾回收,myAlloc
中的结构需要是指向分配块的集合指针。哈希表或基于trie的数据结构将是速度、内存开销和简单性之间的合理折衷。您可以使用类似的表来跟踪收集期间标记的块。 - Gilles 'SO- stop being evil'