2009-02-26 118 views
2

好的,所以我有一个非常大的多线程非托管C++应用程序(服务器)在Windows 2003服务器上运行。它为20-50个并发用户提供会话,执行各种业务逻辑......有时,由于用户在客户端中打开大量窗口,因此可能会使用大量内存,例如对象/会话缓存(每个窗口都有一个单独的服务器会话)非托管的VC++应用程序在Windows服务器上的内存消耗

我们经常看到消耗超过5-600 MB的物理内存和5-600 MB的虚拟内存。一旦达到这一点,我们似乎开始'出的内存'错误

现在我知道Windows会在感觉到需要释放物理内存时启动页面错误,并且win32应用程序通常只能分配高达4GB的内存,实际上只有2GB可用于'user-m'应用程序的实际使用ode'的地址空间,甚至更少的后其他库加载后...我不确定'用户模式'的内存使用情况是什么在任务管理器上报告...

因此无论如何我的真正的问题是:

如何找出我的应用程序有多少用户模式内存以及在任何给定时间使用了多少(最好来自应用程序之外,即某些窗口管理工具)?

查看Process Explorer和网站后,它看起来像'虚拟大小'值是应用程序有权访问多少内存的值。

+0

啊,我忘了补充,我们有2 GB内存的服务器,这在VMware虚拟机托管之一。 – uzbones 2009-02-26 02:43:48

回答

5

听起来像是Process Explorer, a free utility from Microsoft SysInternals情况:

alt text 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 。

过程 的独特功能浏览器使其可用于跟踪 下DLL版本问题或处理 泄漏,并提供洞察 方式Windows和应用程序的工作。


如果您在终端服务器的特定信息方面寻找更多的信息,我一直在关注被释放工具的测试,我相信会满足您的需要一个程序员的博客完美。这是一个改进的TSAdmin。他称之为TSAdminEx。

请参阅下面的截图和click here to learn more about it and to get the beta。它是免费软件,顺便说一句。

alt text

+0

进程资源管理器和任务管理器都擅长显示当前正在使用多少内存,但它们能显示应用程序可能使用多少内存? – uzbones 2009-02-26 11:38:19

0

您写道:

当你谈论一个 的Win32应用程序可以有多少内存访问我 没有看到为他们专门 称之为“用户模式”记忆选项或至少我 不知道它真的是什么列。

Have a look at this article(由Process Explorer的创建者Mark Russinovich博士撰写)。

为了能够有效地管理您的Windows系统,您需要了解Windows如何管理物理资源(如CPU和内存)以及逻辑资源(如虚拟内存,句柄和窗口管理器对象)。了解这些资源的限制以及如何跟踪其使用情况,可以将资源使用情况归因于使用这些资源的应用程序,有效调整特定工作负载的系统大小并识别泄漏资源的应用程序。

3

我知道你最好从应用程序之外询问,但我一直在搜索如何从我自己的程序中找到这些信息,并偶然发现了你的帖子。所以,这将有利于那些想从获得这些信息的人在其程序中。

非托管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; 
} 
相关问题