voi*_*ter 4 c++ memory windows
我正在使用C++在Windows上构建的服务器应用程序在虚拟大小达到大约2GB(32位应用程序,启用了大地址识别)时会耗尽内存.但是,我注意到Private Bytes明显更小.目前的统计数据是:
虚拟大小:2.6GB私有字节:1.6GB
这两个数字的差异是1GB.所以我的问题是:
我还通过VMMap实用程序运行我的应用程序,我注意到"私有数据"通常比承诺大小高出一个数量级.换句话说,私有数据的总大小可能是200MB,但承诺大小只有20MB.我不确定私有数据是什么,但根据我的研究到目前为止它似乎表明它只是堆的一部分.
编辑:
我使用Purify查找了内存泄漏但我没有找到任何有用的东西.没有指针的内存形式的内存泄漏似乎不是问题,但内存泄漏持续时间太久可能是一个问题,我还没有考虑过.但是,关键是要了解Virtual Size导致内存不足问题的原因.问题#1对我来说是最重要的.
这需要一点解释,所以请坚持下去.
首先,这个主题是一个令人困惑的冲突条款的泥潭,所以请抛弃你所拥有的"虚拟内存"与磁盘有关的所有概念.
快速说明我们为什么这样做:如果我们给进程直接内存地址,我们只能(可行)有一个内存存储.这是不方便的,也不利于性能.当虚拟地址转换为系统内存(RAM)范围之外的物理地址时,处理器会发出页面错误.这表示OS中的中断处理程序,然后可以将内存访问操作委托给其他设备.有用!
在32位Windows系统上,进程在任何一个时间点可以处理的最大虚拟内存量为2GB.使用AWE可以增加到3GB,或者使用AWE增加到4GB /4GT.这并不意味着进程只能分配2GB(或3GB/4GB,具体取决于前面讨论的设置)的内存.它只是意味着它不能同时访问更多.
例如,如果打开1GB大小的内存映射文件,则虚拟内存使用量将增加1GB.您没有触及RAM,也没有触及磁盘,但是您已经为进程分配了一块虚拟地址空间.如果您希望在拥有此内存映射文件的同时分配1.1GB的RAM,则不能.您必须先从流程中取消映射文件.请记住,内存仍然可以保持分配并且数据已满,但实际上并未映射到您的进程中.如果您的计算机上有8GB的RAM,您可以用数据填充6GB,并将2GB的内容映射到您的进程中.当您需要使用该内存的不同部分时,必须取消映射现有块并映射其他部分.
所以,你看到的差异:
专用字节告诉您进程已映射的虚拟设备内存的字节数,不包括与其他进程共享的虚拟内存(例如映射文件,全局堆等).
工作集会告诉您正在使用的物理内存的字节数.这包括物理内存,设备缓冲区和映射文件.这是一个非常奇怪的数字,因为它等同于触及的物理内存+映射的虚拟非系统内存.一般来说,你应该完全忽略这个数字.调试内存泄漏几乎没用.
虚拟字节是您映射的虚拟内存总量.
区别在于您已将共享虚拟内存(例如一堆DLL文件或一组全局堆)映射到您的进程中.差异表明这些共享映射的总大小约为1GB.
请记住,这与交换没有任何关系,这是将系统内存页面传输到磁盘(所谓的"页面文件")以增加快速系统资源(RAM)的可用性.该文件的命名在Windows的这个领域引起了混乱,当微软最终决定将其称为"交换"而不是"虚拟内存"或"页面文件"时,我会感到高兴.
| 归档时间: |
|
| 查看次数: |
5151 次 |
| 最近记录: |