垃圾回收 - 使用 valgrind 调试自定义内存分配器时,"pool"的作用是什么?


关于调试自定义内存分配器的Valgrind文档基于一个称为"池"的抽象。我在弄清楚如何使用池时遇到了一些困难。我最初的猜测是,因为我有一个相当简单的内存分配器(标记和清除垃圾收集器(,所以我只能使用一个"池"。也许如果我有多个实体以不同的方式管理不同的内存,我会使用多个"库"?

我很乐意为您提供任何关于如何使用池的指导,或者您在应用程序中如何使用池。

我来晚了一点。我了解到,pool只是我们正在分配的valgrind区块的一个参考/锚定地址。在我的情况下,池是动态的(拆分堆(,每当分配内存堆块时,我都会将其标记为noaccess(如文档所建议的(,而每当分配新对象(valgrind chunk(时,我会使用池地址调用VALGRIND_MEMPOOL_ALLOC。这使得valgrind能够一次处理多个池。我们也可以直接销毁池,valgrind会自动释放池中的对象,然后当我们创建新池时,valgrid知道新对象不会与以前的对象重叠,从而防止错误。

这是我的代码:https://github.com/eclipse/omr/pull/1311。还有一个指向文档的链接,其中包含我如何理解和使用api。

相关内容

最新更新