выделение оперативной памяти показывает удвоение использования оперативной памяти в диспетчер задач

Выполняя профилирование (память и скорость), я был потрясен тем фактом, что win7, кажется, выделяет ровно вдвое больше оперативной памяти, которую я прошу ... Обратите внимание, что я впервые делаю такое активное профилирование на win7, поэтому я действительно не знаю, чего ожидать.

Я выделяю точное количество ОЗУ в цикле, используя экспресс-версию MSVC под win7 (64-бит). Приложение скомпилировано и работает в 32-битном режиме.

Я выделяю 24 МБ оперативной памяти, и диспетчер задач показывает, что мое приложение использует 48 МБ (во всех столбцах памяти, включая зафиксированные, поскольку я фактически копирую память в новых регионах. ). Когда я получаю еще 24 (должно быть 48 МБ), мое приложение переходит на 96 и т. Д.

Они распределяются как 1 000 000 24-байтовых структур.

Я поискал в сети, но не нашел ничего, что соответствовало бы моим наблюдениям. точно.

Кто-нибудь знает?

Если это всего лишь уловка ОС (или некомпетентность?), есть ли какой-нибудь инструмент, который может дать мне реальное потребление памяти процессом? (сложно найти утечки, когда приложение фонтанирует для начала; -)

[----------- отредактировано, дополнительная информация -----------]

Примечание (по пути в строке заголовка консоли), что я создаю Режим выпуска (с использованием всех «пустых» настроек проекта по умолчанию MSVC 2010), поэтому не выделяется дополнительная «отладочная» память (которая может быть довольно обширной в некоторых проектах).

вот короткое полное приложение C, которое иллюстрирует поведение:

#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
    u32 type;
    union {
        u32 value; 
        char * str;
        void * data;
        MYS ** block;
        MYS * plug;
    };
    u32 state, msg,  count, index;
};
int main(int argc, char *argv[]){
    int i, j;
    MYS *ref;
    printf ("size of myStruct: %d\n\n", sizeof(MYS));
    for(i=0; i < 10; i ++){
        printf("allocating started...\n");
        for (j = 0; j < 1000000 ; j ++){
            ref = (MYS *) malloc(sizeof(MYS));
            assert(ref);
            memset(ref, 0, sizeof(MYS));
        }
        printf("   Done... Press 'enter' for Next Batch\n");
        _getch();
    }
    _getch();
    return 0;
}

и изображение, которое показывает память на моей машине после одного цикла. При каждом следующем запуске он добавляет ~ 48 МБ вместо 24 МБ!

process info after 1 loop (should be ~24MB)

6
задан moliad 11 July 2011 в 20:42
поделиться