【发布时间】:2009-11-23 03:39:36
【问题描述】:
由于 CLRProfiler 使用 HEAP statistic、OBJECTS finalized 之类的词,这让我觉得它最多只会显示盒装结构?那么如果结构是我问题的根源呢?我如何使用 CLRProfiler 了解它??
【问题讨论】:
由于 CLRProfiler 使用 HEAP statistic、OBJECTS finalized 之类的词,这让我觉得它最多只会显示盒装结构?那么如果结构是我问题的根源呢?我如何使用 CLRProfiler 了解它??
【问题讨论】:
根据文档
“CLRProfiler 是一个专注于分析垃圾收集器堆中发生的事情的工具”
因此您自然会看到有关堆的各种统计信息。
结构是值类型,所以当它们自己分配时,它们是在堆栈上分配的。堆栈在堆栈展开期间被清理,因此不受 GC 的垃圾收集。如果值类型是装箱的,或者如果它们是引用类型的一部分,则更常见的是,它们的值将存储在堆中。
我的猜测是,如果结构是您问题的根源,那是因为您的应用程序存储了大量此类结构。这通常使用数组(这是许多 .NET 集合的基础类型)来完成。数组是引用类型,所以存放在堆上。如果数组包含结构,则值也作为数组实例的一部分在堆上。
换句话说,如果您想在运行时检查独立结构,您必须将它们定位在正在运行的托管线程的堆栈中。老实说,我对 CLRProfiler 不太熟悉,所以我不知道它是否支持。但是,您可以使用诸如 WinDbg 之类的调试器来检查它。另一方面,如果相关结构存储在集合中,则必须在堆上定位实例。
【讨论】: