GC 以略微不同的方式看待您的對象,并在決定什么時候回收它認為不再有用的對象時考慮到這些對象的差異。它這樣做的一個方法是,它有一組根對象,用來確定哪些對象可以被回收。假如對對象的引用大體上屬于如下分類中的某一個,則該引用就被看作是根:全局或靜態對象指針、線程的堆棧上的所有局部變量和參數對象指針、或包含托管堆中的對象的指針的任何 CPU 寄存器。假如對象的引用是根引用,那么它可能有或可能沒有與它關聯的、還會在垃圾回收后幸存的子對象。GC 首先找到根對象,然后沿著引用找到被根引用的其他對象,以便避免回收這些對象。
如圖 1 所示,托管堆中有四個被分配的對象:(S)mall、(L)arge、(F)inalized 和 (R)eferenced。假設每個對象通過其主要特征(例如,小型對象都不會包含引用或其他組合)來標識自己。在堆中分配這些對象時,它們將相互緊鄰地放在內存中。我也有一個位于 (G)lobal 范圍的根引用,它包含對 Z 的引用。
使用分析器時有幾件事情要考慮到,包括線程安全和同步,以及分析器對性能的影響。Profiler API 實際上答應您將它作為 CLR 的一部分運行,這樣,因為多個線程將調用您的分析器,所以您必須知道存在同步問題。Microsoft 提供的 Profiler API 規范聲明:回調不會被序列化。這就需要由開發人員自己來正確保護他的代碼,方法是創建線程安全的數據結構,并在一旦需要防止多個線程并行訪問代碼時鎖定分析器代碼。