gpt4 book ai didi

c - 改进 Windows 应用程序中的堆内存使用情况报告

转载 作者:行者123 更新时间:2023-11-30 15:16:34 25 4
gpt4 key购买 nike

在使用以下代码时,我观察到内存使用量的增加在 PROCESS_MEMORY_COUNTERS 的变量成员中注册得相当快。 ,但随着内存在继续运行的进程中被释放,内存使用量的减少似乎并没有发生

time_t GetMemUsage(void)
{
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS pmc;
DWORD processID = GetCurrentProcessId();

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc));
CloseHandle(hProcess);

return pmc.PeakWorkingSetSize;
}

使用任务管理器,在终止进程后,我几乎可以立即看到物理内存大小的变化(较小),但在进程运行时释放内存不会注册。 (即使在调用上述函数之前经过了相当长的延迟。)

我不确定我的观察是否是由于 free() 的工作方式造成的。 (即,它可能不会通知操作系统内存已释放),或者 Windows 只是将其注册到 PROCESS_MEMORY_COUNTERS 结构时速度很慢。

无论如何,是否有人知道更好的技术来获取有关正在运行的进程内(或用于)实际内存使用情况的更及时、准确报告?

我还尝试查看 pmc.WorkingSetSizepmc.PagefileUsage ,结果相同。

最佳答案

这里发生了几件事。

  1. 内存管理器倾向于在释放内存后保留内存。从理论上讲,您可能很快就需要更多内存,并且将最近使用过的内存还给您比从操作系统获取更多内存更便宜。因此,从操作系统的角度来看,您的程序仍在使用您已释放的内存。

  2. 工作集大小是程序使用的内存的间接度量。操作系统根据程序的内存需求和系统上运行的其他程序的内存压力来确定工作集大小。当您的程序开始使用更多内存时,操作系统(通常)会快速增加进程的工作集以适应它。如果您的程序将大量内存释放回操作系统,这并不一定意味着操作系统会修剪进程的工作集大小。事实上,如果有足够的可用内存,它可能不会打扰。但是,如果许多其他进程需要内存,并且您开始达到 RAM 的容量,那么操作系统将开始修剪超出其当前需要的进程的工作集。

  3. 看起来您的代码示例报告的是峰值工作集大小,而不是当前工作集大小。峰值告诉您进程在其生命周期内达到的最大工作集大小,即使当前工作集小得多。

关于c - 改进 Windows 应用程序中的堆内存使用情况报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com