2012-08-06 228 views
2

我正在檢查我的服務的內存使用情況,並發現私人字節隨着時間增加。該服務會創建所需的新組件,並且只有在服務停止時纔會處理。所以我正在尋找在存在服務調用時創建新組件的代碼,並在不需要時嘗試處理它們。我正在使用PerfMon來檢查專用字節。結構和垃圾收集

那麼我在正確的軌道上呢?

此外,我發現該方法的一個每次創建新的結構,然後它不被處置或分配給null。

var structInfo = new MyStruct(); 
structInfo .StructSize = Marshal.SizeOf(structInfo); 
MyClass info = this.BuildStructInfo(structInfo); 
return info; 

編輯:

該方法返回其自結構獲取其值的類。

我是否需要處置structInfo,如果我什麼都不做,它會被GC收集嗎?

+0

分配內存很貴。 CLR將會保留系統給它的儘可能多的內存。除非你遇到OOM異常,否則不要擔心。 – Will 2012-08-06 12:47:42

+0

根據你我需要看看其他代碼,而不是擔心這個? – 2012-08-06 12:53:47

+2

Knuth認爲,過早優化是萬惡之源。你有沒有記憶問題,「嘿,偶然我看了我的應用程序的內存使用情況,它不應該這麼高」?如果不是,那麼就放棄它。 – Will 2012-08-06 13:06:28

回答

3

結構是一個值類型(例如int)。如果它超出範圍,它將自動被GC'ed。

有時您可能會發現內存使用量在不斷增加,並且沒有任何內存泄漏:如果有足夠的內存可用,您的GC將無法經常運行。

我建議使用內存分析器,它可以告訴你爲什麼一些對象保持活着。我可以推薦YourKit for .NET profiler,其中有一個30天的免費試用:

  • 通過YourKit啓動應用程序
  • 將存儲快照
  • 搜索/瀏覽你的類你懷疑被泄露
  • 選擇從GC-根路徑
3

我在你的代碼中看到info結構是返回給調用者。所以,從問題的角度來看,我會說,只有上帝知道誰會以及如何使用它。

關於結構調用Dispose(..)如果你有一些非託管資源內部分配,並希望擺脫它們的隱含。

在另一方面,如果你沒有更多的需要的是info內存位置,只是分配一個null它,所以GC可能收集它下一個行程。

+0

Thanks.Its不可空,我不能改變這一點。更新我的問題。 – 2012-08-06 12:44:40

+1

@RaoBHavik:傾向於不像全局變量那樣使用它,但是在嵌套執行的某個層次上,它變成了本地/函數變量,所以作爲範圍退出'GC'將清理它,所以。如果你需要更持久的東西,只需使用'class'來代替。 – Tigran 2012-08-06 12:50:19

1

服務營造它需要新的組件和他們只得到處理了when服務停止

因此,您的服務必須以某種方式堅持這些組件。它可能是有目的的(例如緩存)或偶然的,只有你可以知道。

我是否需要處置structInfo,會是GC回收,如果我沒有做任何事情

如果structInfo是值類型,它只是在棧中分配和刪除,如果它在你的片段中看起來很小的範圍之外。 GC不參與此處。 structInfo的類型是否實現IDisposable(*)或其他類型的配置機制?如果是這樣,請直接撥打Dispose

(*)除了一些特殊的情況,這是一個相當危險的業務,你需要非常清楚你在做什麼。