0

我使用 jemalloc 3.6.0-11。我调用 posix_memalign 来分配一个非常大的块。分配后,我要求madvise(ptr, size, MADV_DONTDUMP);将此分配从核心转储中排除。

在释放此内存之前,我调用madvise(ptr, size, MADV_DODUMP);是因为我希望如果这些页面将在将来的分配中分配,它们将不会保持标记为 DONTDUMP。

问题是在大多数情况下,我刚刚释放的内存并没有返回给OS(即进程的虚拟内存仍然包括分配;在/proc//status中分配大小仍然是一个VmSize 的一部分);事实证明,核心转储是基于进程的虚拟内存的;所以释放内存后,释放的页面将包含在核心转储中。

有谁知道如何解决这个问题?

提前致谢!

4

2 回答 2

0

你的内存页面对齐了吗?根据Linuxmadvise()手册页madvise()如果不是,则会失败:

   EINVAL `addr` is not page-aligned or `length` is negative.
于 2020-11-15T17:23:06.733 回答
0

我认为到目前为止,解决您的问题的最简单方法是绕过mallocmmap直接使用来分配您的大块,并munmap在完成时使用。这有几个好处:

  • 您知道您可以独占使用相关页面,而不必担心它们会与堆上的其他内容重叠(取决于您请求的对齐方式和大小),或者担心malloc的元数据可能在哪里。特别是,您可以madvise随心所欲地使用它们,而不会影响其他任何东西。

  • 对于一个非常大的块,如果您可以在完成后立即将其返回到操作系统,那么它对系统的其余部分很有礼貌,而您malloc可能(就像它似乎正在做的那样)坐在它上面以备后用分配,也许你永远不会这样做。

  • munmap配置块肯定会确保它不会被倾倒。

实际上不应该有任何性能问题,因为对于一个非常大的块,posix_memalign几乎可以肯定必须从操作系统获取内存,所以无论如何都会有一个系统调用,听起来你不会分配并经常释放它。

于 2020-11-15T17:29:03.443 回答