2009-07-14 48 views
3

這是一個C#3.0問題。我可以使用.net框架提供的反射或內存管理類來統計內存中某個類型的活動實例嗎?我可以在C#中獲取某種類型的活動對象的實例嗎?

我可以使用內存分析器做同樣的事情,但需要額外的時間來轉儲內存並涉及第三方軟件。我想要的只是監視某種類型,我想要一個可以輕鬆進行單元測試的輕量級方法。計數活動實例的目的是爲了確保我沒有任何可能導致「內存泄漏」的預期活動實例。

謝謝。

回答

0

我看到要做到這一點的唯一方法是沒有任何形式的儀器來使用CLR Profiling API跟蹤對象的生命週期。我不知道任何可用於託管代碼的API來執行相同的操作,並且據我所知,CLR不會將活動對象的列表保留在任何位置(因此即使使用Profiler API您也必須創建數據自己的結構)。

VB.NET有一個功能,它可以讓你跟蹤調試器中的對象,但它實際上會爲此發出額外的代碼(基本上將所有創建的對象註冊到弱引用的內部列表中)。你也可以這樣做,例如使用PostSharp後處理你的程序集。

1

要在應用程序中完全做到這一點,你可以做一個實例計數器,但它需要在每個類中進行顯式編碼和管理 - 我沒有注意到讓你查詢框架的銀色子彈從正在執行的代碼中查看有多少實例處於活動狀態。

你要求的是真正的分析器的領域。您可以購買一個或構建您自己的,但它需要您的應用程序作爲探查器的子進程運行。順便說一句,滾動你自己並不是一件容易的事。

如果你要考慮的情況下對付它必須是這樣的:

public class MyClass : IDisposable 
    public MyClass() 
    { 
     ++ClassInstances; 
    } 

    public void Dispose() 
    { 
     --ClassInstances; 
    } 

    private static new object _ClassInstancesLock; 
    private static int _ClassInstances; 
    private static int ClassInstances 
    { 
     get 
     { 
      lock (_ClassInstancesLock) 
      { 
       return _ClassInstances 
      } 
     } 
    } 

這只是一個粗略的真正樣品,沒有測試進行編譯;線程安全的0%保證(對於這種類型的方法來說至關重要)並且它將門打開以便調用Dispose,實例計數器遞減,但對於不正確GC的對象。爲了診斷你需要的那種快樂,你猜對了,一個專業的剖析器 - 或者至少是windbg。

編輯:我只注意到你的問題的最後一行,並說需要我上面的方法,如以次充好和容易出現故障,因爲它是幾乎可以保證對真正的欺騙和騙你如果您遇到泄漏,請重新安裝實例數量。用於攻擊這些問題的最佳工具IMO是ANTS Memory Profiler。版本5是一個雙重優勢,因爲它們將性能和內存分析器打破成兩個獨立的SKU(曾經被捆綁在一起),但Memory Profiler 5.0絕對是閃電般的。分析這些問題過去一直是緩慢的,但他們已經成爲了家庭的一員。

除非這是針對個人項目的0再分配目的,否則您應該投資ANTS所需的幾百美元 - 但無論如何都要首先使用它的試用期。這對恰恰是這種分析很有用。

相關問題