2016-06-28 28 views
4

如何獲取當前在ThreadLocalThreadStatic存儲中保存的所有引用的列表?所有活動的ThreadLocal <T>和[ThreadStatic]引用的列表

I.e.所有無法進行垃圾回收的對象,因爲某個線程在其thread-local storage中持有對該對象的引用。

我可以在不知道名稱或類型的情況下使用反射來查找這些實例或至少它們的總大小嗎?

還是失敗了,以某種方式在Visual Studio 2010中顯示它們? (我找了另外一個完全成熟的內存分析器的東西)

我的動機是這樣的:我只是其中一個ConcurrentBag的內容舉行了各種線程池線程一個非常討厭的內存泄漏,即使原始ConcurrentBag早已超出範圍和垃圾收集。雖然我壓扁了這個特殊的bug,但我想知道是否還有更多這樣的bug存在。

理想情況下,我想要一些方法來定期記錄線程本地存儲所擁有的對象的數量,以及它們在運行時的大小。

+0

您可以使用微軟的nuget包CLRMD實時動態檢索進程中的調試信息:https://github.com/Microsoft/clrmd/blob/master/Documentation/TypesAndFields.md 但是,通過我自己的測試,它似乎總是報告一個空的ThreadStaticFields集合。這可能是一個待解決的錯誤。它適用於ThreadLocal 這是一個標準類型,而不是像ThreadStatic這樣的特定屬性。 –

+0

線程靜態存儲不是唯一的根存儲位置。在.NET中有很多其他類型的存儲位置是根源的。 – Servy

+0

雨果,我相信除非你用某種調試器來附加你的過程,否則還是沒有辦法做到這一點,在這種情況下,西蒙的建議對我來說很好。原因在於,正如在http://stackoverflow.com/questions/28605611/how-to-get-threadstatic-value-of-another-thread上提到的那樣,這是VM/JIT的深入實現細節。 – SergGr

回答

2

不幸的是,沒有辦法做到這一點。

您應該確保使用IDisposable實現清理並在適當時使用(某些IDisposable)。

框架本身確實爲您計算引用,但沒有API將此信息公開給正在運行的代碼。