好的,所以我有一个非常大的multithreading非托pipec + +应用程序(服务器),运行在Windows 2003服务器上。 它为20-50个并发用户提供会话,执行各种各样的业务逻辑…有时,由于用户在客户端打开大量窗口,因此可能会使用大量内存,例如对象/会话caching(每个窗口都有一个单独的服务器“会话”。
我们经常看到消耗超过5-600 MB的物理内存和5-600 MB的虚拟内存。 一旦到了这一点,我们似乎开始有“内存不足”的错误。
现在我知道Windows在感觉到需要释放物理内存时会启动页面错误,而且win32应用程序通常只能分配高达4GB的内存,实际上只有2GB的内存可用应用程序实际使用'用户模式'的地址空间,甚至在其他库加载后更less…我不确定'用户模式'的内存使用情况是在任务pipe理器上报告的。 ..
所以无论如何,我真正的问题是:
我怎样才能知道我的应用程序有多less访问用户模式的内存,以及在任何给定的时间使用了多less(最好是从应用程序之外,也就是某些窗口pipe理工具)?
在查看Process Explorer和网站之后,看起来值“虚拟大小”是应用程序有权访问多less内存的值。
听起来就像是一个来自Microsoft SysInternals的免费实用程序Process Explorer的情况:
替代文字http://i.technet.microsoft.com/bb896653.ProcessExplorer(en-us,MSDN.10).jpg
描述:
有没有想过哪个程序有一个特定的文件或目录打开? 现在你可以找到。 Process Explorer向您显示有关哪些句柄和DLL进程已打开或加载的信息。
Process Explorer显示由两个子窗口组成。 顶部窗口总是显示当前活动进程的列表,包括他们拥有的帐户的名称,而底部窗口中显示的信息取决于Process Explorer所在的模式:如果处于手动模式,您将看到处理在顶部窗口中选择的进程已打开; 如果Process Explorer处于DLL模式,您将看到进程已经加载的DLL和内存映射文件。 Process Explorer还具有强大的搜索功能,可以快速显示哪些进程打开了特定的句柄或加载了DLL。
Process Explorer的独特功能使其可用于追踪DLL版本问题或处理泄漏,并深入了解Windows和应用程序的工作方式。
如果您正在寻找终端服务器特定信息方面的更多信息,我一直在关注一个程序员的博客,他正在发布一个测试版的工具,我相信这个工具将完全适合您的需求。 这是一个改进的TSAdmin。 他称之为TSAdminEx。
看下面的截图, 点击这里了解更多关于它,并获得测试版 。 这是免费软件,BTW。
我知道你最好从应用程序之外寻求,但是我在Google上搜索如何从我自己的程序中找到这些信息,并偶然发现你的帖子。 所以,这是为了在他们的程序中想要这些信息的人们受益。
非托管C ++
#include <windows.h> #include <stdio.h> #include <psapi.h> void PrintMemoryInfo( DWORD processID ) { HANDLE hProcess; PROCESS_MEMORY_COUNTERS pmc; // Print the process identifier. printf( "\nProcess ID: %u\n", processID ); // Print information about the memory usage of the process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL == hProcess) return; if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) { printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount ); printf( "\tYour app's PEAK MEMORY CONSUMPTION: 0x%08X\n", pmc.PeakWorkingSetSize ); printf( "\tYour app's CURRENT MEMORY CONSUMPTION: 0x%08X\n", pmc.WorkingSetSize ); printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakPagedPoolUsage ); printf( "\tQuotaPagedPoolUsage: 0x%08X\n", pmc.QuotaPagedPoolUsage ); printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakNonPagedPoolUsage ); printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", pmc.QuotaNonPagedPoolUsage ); printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage ); } CloseHandle( hProcess ); } int main( ) { PrintMemoryInfo( GetCurrentProcessId() ); return 0; }
你写了:
当你谈论一个win32应用程序可以访问多少内存时,他们专门称之为“用户模式”的内存,我不认为这是一个选项,至少我不知道它是什么列。
看看这篇文章 (由Process Explorer的创建者Mark Russinovich博士撰写)。
为了能够有效地管理Windows系统,您需要了解Windows如何管理物理资源(如CPU和内存)以及逻辑资源(如虚拟内存,句柄和窗口管理器对象)。 了解这些资源的限制以及如何跟踪其使用情况,可以将资源使用情况归因于使用这些资源的应用程序,为特定工作负载量身定制一个系统,并确定泄漏资源的应用程序。