Использование памяти.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 это отображает ~ 400kb, что кажется нормальным. Но когда я использую такой код:
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 хостинга?
PS Я знаю о AppDomain.MonitoringTotalAllocatedMemorySize, но он отображает общий объем используемой памяти всем AppDomain, и я хочу получить данные для конкретного используемого потока памяти.
ОБНОВЛЕНИЕ 1: Добавлен код 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