Windows服务器上的非托管C ++应用程序内存消耗

时间:2009-02-26 02:40:46

标签: windows visual-c++ memory

好的,所以我有一个非常大的多线程非托管c ++应用程序(服务器),它运行在Windows 2003服务器上。它为20-50个并发用户提供各种业务逻辑的会话...有时,由于用户在客户端打开了大量窗口等对象/会话缓存之类的东西,它可能会占用大量内存(每个窗口都有一个单独的服务器'会话'。

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

现在我知道Windows会在感觉需要释放物理内存时启动页面错误,而且win32应用程序通常只能分配最多4GB的内存,实际上只有2GB的内存可供应用程序实际使用的“用户模式”地址空间,甚至更少的其他库加载后......我不确定'用户模式'内存使用情况是否在任务经理......

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

我如何知道我的应用程序可以访问多少用户模式内存,以及在任何给定时间(最好是从应用程序外部,即一些Windows管理工具)使用了多少?

[edit]查看Process Explorer和网站后,看起来“虚拟大小”值是应用程序可以访问的内存量的值。

3 个答案:

答案 0 :(得分:5)

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

alt text
(来源:microsoft.com

说明

  

曾经想知道哪个节目有   特定文件或目录打开?现在   你可以找到。 Process Explorer   显示有关哪些信息   句柄和DLLs进程已打开   或装载。

     

Process Explorer显示包含   两个子窗口。顶部的窗口   始终显示当前的列表   活动进程,包括名称   他们自己的帐户,而   信息显示在底部   窗口取决于模式   Process Explorer位于:如果它在   处理模式,你会看到句柄   该过程在顶部选中   窗户已经打开;如果是Process Explorer   在DLL模式下,你会看到DLL和   内存映射文件即该进程   装了。 Process Explorer也有   强大的搜索功能   快速向您展示哪些流程   特定句柄打开或DLL   加载。

     

Process的独特功能   资源管理器使其对跟踪很有用   关闭DLL版本问题或处理   泄漏,并提供洞察力   Windows和应用程序的工作方式。


如果您正在寻找有关终端服务器特定信息的更多信息,我一直在关注程序员的博客,该博客正在发布我认为完全符合您需求的工具的测试版。它是一种改进的TSAdmin。他称之为TSAdminEx。

请参阅下面的屏幕截图和click here to learn more about it and to get the beta。它是免费软件,BTW。

alt text

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您写道:

  

当你说话时记忆多少   win32 app可以专门访问它们   把它称为'用户模式'记忆我   不要看作是一种选择,或者至少是我   不知道它到底是哪一列。

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

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