共用方式為


分析 API 的記憶體回收

分析工具可以接收記憶體回收告知。

當使用者指定 COR_PRF_MONITOR_GC 旗標時,除了 ICorProfilerCallback::ObjectAllocated 事件,所有記憶體回收事件都會在分析工具中引發。 基於效能理由,ObjectAllocated 事件是由 COR_PRF_MONITOR_OBJECT_ALLOCATED 旗標明確控制。 請注意,啟用 COR_PRF_MONITOR_GC 旗標時,會關閉並行記憶體回收。

在 .NET Framework 1.0 和 1.1 版中,當暫止原因是 COR_PRF_SUSPEND_FOR_GC 時,程式碼分析工具會藉由監視 ICorProfilerCallback::RuntimeSuspendFinishedICorProfilerCallback::RuntimeResumeStarted 回呼,判斷是否正在發生記憶體回收。 在關機期間,Common Language Runtime (CLR) 也會暫止,因為執行階段已處在暫止狀態,一個或多個記憶體回收可能會在不通知程式碼分析工具的情況下發生。 在這種情況下,偵測記憶體回收完成並不簡單。 程式碼分析工具必須偵測在 ICorProfilerCallback::ObjectReferencesICorProfilerCallback::RootReferences 回呼後第一個發生的 ObjectAllocated 回呼。

在 .NET Framework 2.0 (含) 以後版本中,程式碼分析工具可以使用 ICorProfilerCallback2::GarbageCollectionStartedICorProfilerCallback2::GarbageCollectionFinished 回呼,判斷是否正在發生記憶體回收,以及識別涵蓋哪些層代 (如需記憶體回收層代的詳細資訊,請參閱 COR_PRF_GC_GENERATION 列舉型別)。這些回呼沒有上一段所述的關機問題。

注意事項注意事項

在實作 Intel Itanium 架構 (之前稱為 IA-64) 的 64 位元系統中,執行 WOW64 x86 模擬器的應用程式並不支援並行記憶體回收。如需在 64 位元 Windows 系統上使用 WOW64 的詳細資訊,請參閱執行 32 位元應用程式 (英文)。

記憶體回收封鎖

當 Common Language Runtime 呼叫 ICorProfilerCallback 介面中的特定方法時,直到分析工具從該呼叫傳回控制項之前,執行階段都無法執行記憶體回收作業。 這是因為分析服務無法一直針對記憶體回收,將堆疊建構至安全的狀態。 反之,在該回呼期間,將停用記憶體回收。 在這些情況下,分析工具應該盡快傳回控制項。 此狀況適用於下列回呼:

此外,下列回呼可使用 fIsSafeToBlock 參數,讓分析工具逐一針對各呼叫封鎖記憶體回收。

請注意,如果分析工具確實已封鎖記憶體回收,將會延遲該作業。 只要分析工具不要呼叫會觸發記憶體回收的 CLR 函式,或是在 Managed 堆積 (Heap) 中配置空間,這種延遲就不會有危害。

請參閱

概念

分析概觀