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