我正在尝试使用.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