0

我正在尝试使用 .Net Hosting API 收集 AppDomain 使用的内存信息。我在 C++ 上实现了自定义 IHostMemoryManager 和 IHostMalloc 类,并在创建 CRL 运行时期间指定了它们。它类似于那篇文章 - 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 中使用的内存?

PS我知道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

4

0 回答 0