如何强制清除 STL 内存缓存
How can I force the STL memory cache to clear?
我有一个类,它有一个类型为 unordered_map
的字段。我在应用程序中创建了此对象的单个实例,该实例包装在shared_ptr
中。该对象非常消耗内存,我想在使用完后立即将其删除。但是,重置指针只会释放对象占用的一小部分内存。如何强制程序释放对象占用的所有内存?
以下模拟程序重现了我的问题。打印垃圾的 for 循环只是为了给我足够的时间来观察top
使用的内存。析构函数在 reset()
之后被调用。此外,紧接着,使用的内存从大约 2 GB 下降到 1.5 GB。
#include <iostream>
#include <memory>
#include <unordered_map>
using namespace std;
struct A {
~A() {
cerr << "Destructor" << endl;
}
unordered_map<int, int> index;
};
int main() {
shared_ptr<A> a = make_shared<A>();
for (size_t i = 0; i < 50000000; ++i) {
a->index[2*i] = i + 3;
}
// Do some random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "First" << endl;
}
a.reset();
// More random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "Second" << endl;
}
}
编译器:g++ 4.6.3。
GCC的标准库没有"STL内存缓存",在其默认配置(几乎每个人都使用(中,std::allocator
只调用new
和delete
,它们只调用malloc
和free
。 malloc
实现(通常来自系统的 C 库(决定是否将内存返回到操作系统。 除非您位于没有虚拟内存的嵌入式/约束系统上(或者您已经关闭了过度提交(,否则您可能不想返回它 - 让库做它想要的。
操作系统不需要内存,它可以毫无问题地为其他应用程序分配千兆字节的虚拟内存。每当人们认为他们需要返回内存时,通常是因为他们不了解现代操作系统如何处理虚拟内存。
如果你真的想强制 C 库将内存返回给操作系统,C 库可能会提供非标准的钩子来这样做,例如对于 GNU libc,你可以调用 malloc_trim(0)
来强制将最顶层的可用内存块返回给操作系统,但这可能会导致你的程序下次需要分配更多内存时变慢, 因为它必须从操作系统中取回它。 有关更多详细信息,请参阅 https://stackoverflow.com/a/10945602/981959(以及那里的其他答案(。
不能保证应用程序会将内存释放回操作系统。它仍可供应用程序使用,但在应用程序退出之前,OS 可能不会回收它以供常规使用。
- 有没有办法检查内存缓存是否已重新启动?
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 多线程C :从内存中读取力,绕过缓存
- 设备驱动程序内存缓冲区处理器缓存问题
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- 是通过计算能力1.x的设备中的缓存的全局内存负载/商店
- 在紧密的物理和碰撞循环中进行缓存友好的内存访问
- 在处理内存中的一些长向量时如何不弄乱缓存?
- 如何在 Linux 下C++获取缓冲/缓存内存大小
- C++内存缓存库
- C++内存缓存类
- CPU 缓存是否也从以前的内存位置加载信息
- Cortex-A8 强制内存缓存
- 我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?
- volatile限定符是否取消此内存的缓存
- 如何从C++将某些内存范围标记为不可缓存
- C++:缓存JSON而不是对象可以减少内存消耗吗
- 内联函数是如何增加内存缓存未命中的,以及与替代函数相比,它为什么不好
- 如何强制清除 STL 内存缓存
- 指针在内存缓存方面的性能