程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於垃圾回收(GC和Marshal)有感,gcmarshal

關於垃圾回收(GC和Marshal)有感,gcmarshal

編輯:C#入門知識

關於垃圾回收(GC和Marshal)有感,gcmarshal


  最近做一個掛機軟件。要求是掛個三四天沒事,不會報錯。開始的時候都是順利的,所有步驟都是可以ok。但是當測試運行的是就出現問題了,內存居然會在一個Task跑完之後暴漲幾M的內存。開了一台測試機測試了一天,內存持續洩漏,毫無停止的跡象。測試機4G的內存基本跑完。檢測後發現的調用的組件問題,應該的調用的C++組件自己沒有釋放資源。這個問題一共持續了兩個禮拜。期間嘗試了各種方法,GC和Marshal都用了,還是無果。最後用了用了笨辦法,不去刻意的創建那些對象,一直使用一個對象,然後單對象跑,測試後發現內存正常了,有正常的回收。

  說實話,我對.NET的GC還是很相信,還是認為靠譜的,但是在內存洩漏面前,這些都是浮雲。GC管理不到他們(這些調皮的家伙),我嘗試用Marshal去釋放句柄,結果也是一樣,不管是COM創建的還是其他,一直是增長的。

  說一句Dispose也好Destroy也罷,Close也行,其實我都用上,最後我還設了對象為null。最後不管其他還是GC。還是提醒自己,.NET雖然安全,GC也是靠譜,但是自己對內存這件事也是要看重,我是對C++的那些內存束手無策了。很多人說誰創建的誰釋放,但是對於一些封裝的組件,內存洩漏了就很難入手。其實托管的對象,只要別寫的太水,GC還是很強大的,至少編譯器在編譯成IL的時候已經做了處理。當然如果真的相對垃圾回收有確切的認識,可以自己建一個項目去監控自己的內存,去確切的體會。看百遍書不如實踐測試來得有效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved