Я пытаюсь собрать информацию о памяти, которая используется 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
Задача ещё не решена.
Других решений пока нет …