强制向操作系统释放内存

Posted

技术标签:

【中文标题】强制向操作系统释放内存【英文标题】:Force memory release to the OS 【发布时间】:2015-09-20 19:58:42 【问题描述】:

我有一个需要大约 20 MB 内存的应用程序。在一个很少使用的算法中,它 (std::vector) 临时分配 250 MB。解除分配后,systemmonitor 仍然显示此用法。如何将内存释放回系统?

【问题讨论】:

为什么需要发布它?你不能就这样吗? @jalf:可能担心这是泄漏,并且其他程序无法使用该内存。一个合理的问题,如果仅仅是因为它显然源于一个误解。 内存是直接在vector中使用还是从vector中的对象指向的?每个版本的默认分配器都有一个单独的块大小的截止值,超过该值分配以不同的方式完成,因此释放一直回到操作系统。如果 250MB 在一个巨大的块中(向量中的实际对象),那么释放它应该转到操作系统。但是,如果不直接使用内存,您的症状就会更有意义。 在最后一次测试中,250'000 个指向元素的指针,分配有new,导致 250MB 内存使用。好的,我意识到问题不在于矢量 【参考方案1】:

你不能,也不应该。

虚拟内存分配是复杂的,仅仅在系统监视器中观察一个数字是无法充分理解的。看起来好像一个进程使用了​​比它应该使用的更多的内存,但这只是虚拟内存寻址方式的产物。

请放心,如果您已正确释放此内存,并且操作系统确实需要它,它将被重新分配。

这里唯一真正可行的一点是停止使用系统监视器,就好像它是对您的进程正在使用的物理 RAM 的准确测量一样!

【讨论】:

"请放心,如果您已正确释放此内存,并且操作系统确实需要它,它将被重新分配。"那是错误的。操作系统不知道内存在进程中被释放。当内存不足时,操作系统无法深入研究进程。充其量,操作系统可以换出这些页面,需要时间和交换空间。【参考方案2】:

使用 mmap() 或 VirtualAlloc() 分配和释放内存。这会立即将其返回给操作系统。

为了与 std::vector 一起使用,您需要为其提供一个 std::allocator。您可能会发现使用放置新的直接析构函数调用来手动滚动您自己的向量会更容易。

通常系统堆分配器会为您正确处理此问题;但是,您似乎发现了一个他们没有的案例。

【讨论】:

将其返回给操作系统并不能保证操作系统会决定将其从进程中取消分配。 有了我命名的系统调用。 是否有与平台无关的方法? 不,但是编写 mmap() -> VirtualAlloc() 包装器是一个简单的练习,所以你会有一个 #ifdef WIN32 void *mmap(...) if (flags & MAP_ANONYMOUS ) 返回 VirtualAlloc(...);否则返回 MapViewOfFile(...); ...

以上是关于强制向操作系统释放内存的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法强制 JavaFX 释放视频内存?

linux下清理内存以及swap

golang内存释放

如何强制 SQL Server 释放内存?

如何强制通用应用程序释放内存?

进程终止会自动释放所有使用的内存吗?有啥理由明确地这样做吗?