首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟字节增长2倍私有字节的原因是什么?

虚拟字节增长2倍私有字节的原因是什么?
EN

Stack Overflow用户
提问于 2010-07-27 21:43:12
回答 4查看 1.1K关注 0票数 1

应用程序的虚拟字节是私有字节的2倍。

这是否表示内存泄漏?糟糕的应用程序设计?

操作系统为32位

欢迎任何想法。应用程序是流数据库。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-28 03:16:05

碎片化。

如果您分配以下内存块:

  • 16KB
  • 8KB
  • 16KB

然后释放8KB的区块,您的应用程序将拥有32KB的私有字节,但40KB的虚拟内存,这实际上是您的进程使用过的最高虚拟内存地址(为简单起见,忽略其他内存部分)。

考虑(如果可能)使用另一个内存管理器。一些替代方案包括:

  • Windows低碎片堆(有关更多信息,请参见http://msdn.microsoft.com/en-us/library/aa366750%28VS.85%29.aspx )
  • Doug-Lea开源内存manager
  • Commercial替代方案,如

第四种选择是编写自己的内存管理器。这并不容易,但如果处理得当,它可能会有相当多的好处。特别是对于某些特定的环境或特殊的应用程序,编写自己的内存管理器可能会很有用。

票数 3
EN

Stack Overflow用户

发布于 2010-07-28 00:37:40

应用程序的虚拟字节是私有字节的2倍。

如果应用程序只分配堆,那么对我来说,这将是应用程序分配了大量内存但从未实际接触过它的标志。例如:

代码语言:javascript
复制
void *p = malloc( 16u<<20 );

会消耗掉16MB的虚拟内存。但只要应用程序不对内存块执行任何操作,操作系统甚至不会尝试将虚拟内存映射到RAM。强制实际分配私有内存的最简单方法是使用memset():

代码语言:javascript
复制
void *p = malloc( 16u<<20 );
memset( p, 0, 16u<<20 );

这是否表示内存泄漏?糟糕的应用程序设计?

或者两者都有。或者两者都不是。

响应的较长变体:未知,取决于应用程序分配的内存、应用程序使用的其他资源、操作系统、硬件平台等。

如果不确定,请使用内存泄漏分析工具进行调查,例如valgrind。有关memory leak analysis in C++的更多信息,请阅读SO。

票数 3
EN

Stack Overflow用户

发布于 2010-07-28 00:33:44

内存分配具有存储有关已分配内容的管理信息的开销。如果您分配的缓冲区非常小,额外的信息可能占总数的很大百分比。这可能就是你所看到的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3344242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档