应用程序的虚拟字节是私有字节的2倍。
这是否表示内存泄漏?糟糕的应用程序设计?
操作系统为32位
欢迎任何想法。应用程序是流数据库。
发布于 2010-07-28 03:16:05
碎片化。
如果您分配以下内存块:
然后释放8KB的区块,您的应用程序将拥有32KB的私有字节,但40KB的虚拟内存,这实际上是您的进程使用过的最高虚拟内存地址(为简单起见,忽略其他内存部分)。
考虑(如果可能)使用另一个内存管理器。一些替代方案包括:
第四种选择是编写自己的内存管理器。这并不容易,但如果处理得当,它可能会有相当多的好处。特别是对于某些特定的环境或特殊的应用程序,编写自己的内存管理器可能会很有用。
发布于 2010-07-28 00:37:40
应用程序的虚拟字节是私有字节的2倍。
如果应用程序只分配堆,那么对我来说,这将是应用程序分配了大量内存但从未实际接触过它的标志。例如:
void *p = malloc( 16u<<20 );会消耗掉16MB的虚拟内存。但只要应用程序不对内存块执行任何操作,操作系统甚至不会尝试将虚拟内存映射到RAM。强制实际分配私有内存的最简单方法是使用memset():
void *p = malloc( 16u<<20 );
memset( p, 0, 16u<<20 );这是否表示内存泄漏?糟糕的应用程序设计?
或者两者都有。或者两者都不是。
响应的较长变体:未知,取决于应用程序分配的内存、应用程序使用的其他资源、操作系统、硬件平台等。
如果不确定,请使用内存泄漏分析工具进行调查,例如valgrind。有关memory leak analysis in C++的更多信息,请阅读SO。
发布于 2010-07-28 00:33:44
内存分配具有存储有关已分配内容的管理信息的开销。如果您分配的缓冲区非常小,额外的信息可能占总数的很大百分比。这可能就是你所看到的。
https://stackoverflow.com/questions/3344242
复制相似问题