c-释放从核心中排除的内存后,核心转储大小会增加



我使用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几乎肯定必须从操作系统中获取内存,所以无论如何都会有一个系统调用,听起来你不会经常分配和释放它。

相关内容

  • 没有找到相关文章