“私人字节”并未反映出来。如何找到进程分配的确切内存?

时间:2014-06-25 07:35:51

标签: c++ windows memory memory-management

以下是在Windows XP上使用VS2010编译和运行的C ++代码示例。

它打印"私有字节"分配前后。

void PrintPrivateBytes()
{
    HANDLE current_process;
    PROCESS_MEMORY_COUNTERS_EX pmc;

    current_process = GetCurrentProcess();

    if (!GetProcessMemoryInfo(current_process, (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc)))
    {
        std::cout << "\nGetProcessMemoryInfo failed" ;
        return;
    }

    std::cout << "\nProcess private bytes: " << pmc.PrivateUsage/1024 << " KB"; 
}

int _tmain(int argc, _TCHAR* argv[])
{
    // Code demonstrating private bytes doesn't change
    std::cout << "\n\nBefore allocating memory" ;
    PrintPrivateBytes();

    char* charptr = new char[8192];
    std::cout << "\n\nAfter allocating 8 KB memory" ;
    PrintPrivateBytes();

    delete[] charptr;
    std::cout << "\n\nAfter deleting memory" ;
    PrintPrivateBytes();

    int RetVal = _heapmin();
    std::cout << "\n\nAfter calling _heapmin" ;
    PrintPrivateBytes();

    return 0;
}

这是输出:

  

在分配内存之前

     

处理专用字节:416 KB

     

分配内存后

     

处理专用字节:428 KB

     

删除内存后

     

处理专用字节:428 KB

     

致电_heapmin后

     

处理专用字节:428 KB

它表示&#34;私有字节&#34;并不反映过程的确切内存使用情况。

哪种Windows API /结构有助于查找完全内存使用过程? (工作集也没用。它只反映了物理内存的使用方式)

1 个答案:

答案 0 :(得分:1)

您检查私有字节的解决方案是正确的,只有您对_heapmin的假设是错误的。

_heapmin无法正常工作。 _heapmin是documented as&#34;将未使用的堆内存释放到操作系统。&#34;

实现(参见&#34; \ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ crt \ src \ heapmin.c&#34;)

int __cdecl _heapmin(void)
{
        if ( HeapCompact( _crtheap, 0 ) == 0 ) {
            return -1;
        }
        else {
            return 0;
        }
}

尽管返回堆中最大的空闲块的大小,HeapCompact仍然是documented通常不做任何事情。如果使用特殊的全局(调试目的)标志,它只会做一些额外的事情。