2013-10-17 105 views
1

我有一個ASP.NET應用程序有多個助手類。我有點擔心內存泄漏。每次我想使用一個輔助類的成員函數我叫他們這樣

new SampleHandler().DoFunction();

既然這麼想的有什麼強引用創建的對象,我可以保證GC是否將清除創建的對象的內存?
由於我有很高的機會讓我不再在頁面中使用對象,所以我開始編寫這樣的代碼。.NET內存泄漏

注意:有很多調用屬於不同幫助類的各種成員函數在代碼隱藏文件中以相同的方式執行

+3

讓你的幫手方法static –

+0

靜態函數有什麼問題? –

+1

靜態函數不是線程安全的。由於在ASP.NET中,靜態函數涵蓋了整個過程的範圍,因此所有用戶都可以使用相同的(靜態)函數。 –

回答

8

是的,由於沒有其他未解決的參考,new SampleHandler()創建的實例只要DoFunction()返回,就有資格收集。

但是,並不能保證GC將像往常一樣收集該實例。

+0

輸入對我來說太快了:( – Phill

+0

你的意思是我可以保證一旦頁面生命到期,GC就會收集它們嗎 –

+1

@DineshKrishnan,不,你可以不用,GC可以保存這些數據到應用程序的整個生命週期如果可以選擇的話,它的設計足夠聰明,可以做出正確的決定,但通常最好讓它決定 –

4

垃圾收集器將處理未使用的引用。所以你不需要擔心內存泄漏。但是,如果你創建「垃圾」對象非常快,你可能會有暫時的內存壓力。

但是,如果您不需要實例或實例可交換,您應該考慮製作方法static

public class SampleHandler 
{ 
    public static void DoFunction() 
    { 
     // ... 
    } 
} 

然後你會稱它爲:

SampleHandler.DoFunction(); 

有一個在ASP.NET靜態方法沒有問題,即使它是一個多線程的環境。但你應該小心靜電場。

+0

否實例不可共享,因爲這些函數通常執行與數據庫相關的任務。 –

+1

@DineshKrishnan只是因爲它執行數據庫任務並不意味着它不能是靜態的。在另一個調用修改引用的情況下,您不能共享靜態方法範圍之外的引用。 – Phill

+0

因爲如果我使它靜態不會幫助方法留在內存中?當有100個靜態方法時它會影響性能嗎? 只是好奇知道。 –