Использование памяти.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

0 ответов

Другие вопросы по тегам