.Net Hosting API内存使用情况

时间:2013-11-24 23:22:22

标签: c# c++ .net memory-management clr-hosting

我正在尝试使用.Net Hosting API收集AppDomain使用的内存信息。 我在C ++上实现了自定义IHostMemoryManager和IHostMalloc类,并在创建CRL Runtime期间指定了它们。它类似于那篇文章 - http://www.codeproject.com/Articles/418259/CLR-Hosting-Customizing-the-CLR-Part-2

我的主要想法是每个分配都会调用IHostMAlloc::Alloc。我添加了一个只计算cbSize参数的计数器,并在运行时停止后显示它。

但问题是这个数字是不同的。对于使用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;
    }

但对于那种情况,它仍然显示~400kb。执行过程在任务管理器中显示~100mb的WorkingSet内存。

是否可以在托管API中计算已用内存?

P.S。我知道AppDomain.MonitoringTotalAllocatedMemorySize,但它显示整个AppDomain的总使用内存,我想获取特定使用内存线程的数据。

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 个答案:

没有答案