非托管代码有一些功能,例如: HeapWalk
等。我可以将它用于托管堆吗?如果没有,我怎么能这样做呢?我并不是指像CLR Profiling API这样的自定义工具,但更简单:我的应用程序可以在某些行中加载自己的对象列表吗?
理论上,我们有GC根,所以我可以通过对象图并枚举对象。但GC没有允许访问内部对象图的方法或属性。我只能调用方法来获取总内存
long totalMemory = GC.GetTotalMemory(true);
但它几乎什么也没有。
答案 0 :(得分:1)
不,GC堆不使用任何winapi函数来实现堆,它是从头开始实现的。唯一的操作系统调用是VirtualAlloc()来为堆段分配地址空间。使用VirtualQuery()进行查询是没有用的,只能向您显示大块而无法观察内部结构。
CLR确实通过DAC将低级调试探针暴露到GC堆中,由mscordacwks.dll支持。最常用的是SOS调试器扩展。但一个基本要求是避免海森堡效应,它不能在过程中使用,因为这会改变你观察到的。它只能由另一个进程(调试器)使用,并且只有在完全冻结进程的执行时才能使内部数据结构稳定。这让kibosh知道让程序本身使用该功能。
如果您正在进行“自我检查”,那么您无需提供帮助,这已经经常进行。它每次垃圾收集器运行时都会发生。使用ExecutionEngineException报告自检失败。