Использование памяти .Net Hosting API

Я пытаюсь собрать информацию о памяти, которая используется AppDomain с помощью .Net Hosting API.
Я реализовал пользовательские классы IHostMemoryManager и IHostMalloc на C ++ и указал их при создании CRL Runtime. Это похоже, как в этой статье — http://www.codeproject.com/Articles/418259/CLR-Hosting-Customizing-the-CLR-Part-2

Моя главная идея состояла в том, что IHostMAlloc :: Alloc будет вызываться для каждого распределения. Я добавил счетчик, который просто считает параметр cbSize и отображает его после остановки Runtime.

Но проблема в том, что этот счет отличается. Для типичного запуска пустого консольного приложения с Hello World это отображает ~ 400 КБ, что кажется нормальным. Но когда я использую такой код:

    private static StringBuilder builder = new StringBuilder();

public static int MemoryPressure()
{
int count = 1024 * 1024 * 50;
for (int i = 0; i < count; i++)
{
builder.Append(1);
}

return 0;
}

Но для этого случая это все еще показывает ~ 400 КБ. Процесс во время выполнения отображает ~ 100 МБ памяти WorkingSet в диспетчере задач.

Можно ли посчитать использованную память в API хостинга?

Постскриптум Я знаю о AppDomain.MonitoringTotalAllocatedMemorySize, но он отображает общий объем используемой памяти всем доменом приложения, и я хочу получить данные для конкретного используемого потока памяти.

Update1: Добавлен код Alloc, который я использую:

static std::map<DWORD, SIZE_T> g_allocatedMemMap;
extern int g_noAllocs;
extern int g_noFrees;
extern long g_totalAllocs;

HRESULT STDMETHODCALLTYPE MyHostMalloc::Alloc(SIZE_T  cbSize,
EMemoryCriticalLevel eCriticalLevel,
void** ppMem)
{
void* memory = new char[cbSize];
*ppMem = memory;
// statistics
DWORD id = ::GetCurrentThreadId();
g_allocatedMemMap[id] += cbSize;

g_totalAllocs += cbSize;

g_noAllocs++;
return S_OK;
}

g_allocatedMemMap — подсчитывает выделение памяти для потока

g_totalAllocs — подсчитывает общее выделение памяти

g_noAllocs — количество выделений

MyHostAlloc наследует интерфейс IHostMalloc

В моем случае как для пустого приложения consol, так и для вызова MemoryPressure Количество выделений составляет ~ 15000

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]