【发布时间】:2009-07-13 14:11:13
【问题描述】:
如何计算我的进程在 Windows 上的可用虚拟地址空间量?
我的应用程序需要限制使用的地址空间量。所以我需要估计我消耗了多少内存,还剩下多少虚拟内存。如果我只剩下几百兆的地址空间,我的进程开始使用自定义分页系统来避免在内存中加载大量数据。
更重要的是:这个需要按进程计算,因为我只关心我的进程,我还在用Win32。
我尝试过 VirtualQuery(),但它没有返回剩余的总地址空间。
谢谢。
【问题讨论】:
如何计算我的进程在 Windows 上的可用虚拟地址空间量?
我的应用程序需要限制使用的地址空间量。所以我需要估计我消耗了多少内存,还剩下多少虚拟内存。如果我只剩下几百兆的地址空间,我的进程开始使用自定义分页系统来避免在内存中加载大量数据。
更重要的是:这个需要按进程计算,因为我只关心我的进程,我还在用Win32。
我尝试过 VirtualQuery(),但它没有返回剩余的总地址空间。
谢谢。
【问题讨论】:
可能需要查看GetProcessMemoryInfo 或GetProcessWorkingSetSizeEx 以确定您正在使用多少内存。
【讨论】:
使用 Win32 API 中的 GlobalMemoryStatusEx 函数。您感兴趣的字段是 ullAvailVirtual,它是您的进程尚未保留或提交的虚拟空间的字节数。
【讨论】:
如果您使用的是 c++,则可以使用自定义内存分配器。但可能您不需要跟踪每个内存分配,只有程序中大多数内存密集型部分需要。
一种选择是在启动时分配内存块并使用 LRU 缓存来重用分配的内存块并仅在内存中保留最近使用的数据。您的程序也会更快(在运行时不需要分配),并且您将防止由于分配/释放内存而导致的内存碎片。
【讨论】: