我使用jemalloc 3.6.0-11。我调用posi_memalign来分配一个非常大的块。分配之后,我将调用madvise(ptr, size, MADV_DONTDUMP);
以从核心转储中排除此分配。
在释放此内存之前,我调用madvise(ptr, size, MADV_DODUMP);
,因为我希望如果在将来的分配中分配这些页面,它们将不会保持标记为DONTDUMP。
问题是,在大多数情况下,我刚刚释放的内存不会返回到操作系统(也就是说,进程的虚拟内存仍然包括分配;在/proc//status中,分配大小仍然是VmSize的一部分(;事实证明,核心转储是基于进程的虚拟内存;因此,在释放内存之后,释放的页面将包含在核心转储中。
有人知道如何解决这个问题吗?
提前感谢!
内存页对齐了吗?根据Linuxmadvise()
手册页,如果不是,madvise()
将失败:
EINVAL `addr` is not page-aligned or `length` is negative.
我认为,到目前为止,解决问题的最简单方法是绕过malloc
,直接使用mmap
来分配您的大块,并在完成时使用munmap
。这有几个好处:
-
您知道您可以独占使用有问题的页面,而不用担心它们与堆上的其他内容重叠(取决于您请求的对齐方式和大小(,也不用担心
malloc
的元数据可能在哪里。特别是,您可以随心所欲地madvise
它们,而不会影响其他任何内容。 -
对于一个非常大的块,如果你能在处理完它后立即将其返回到操作系统,这对系统的其他部分来说是有礼貌的,而你的
malloc
可能(就像它看起来正在做的那样(会放在上面,以便在以后的分配中使用,而你可能永远不会这样做。 -
munmap
对块执行操作肯定会确保它不会被转储。
实际上不应该有任何性能问题,因为对于一个非常大的块,posix_memalign
几乎肯定必须从操作系统中获取内存,所以无论如何都会有一个系统调用,听起来你不会经常分配和释放它。