最近做一個掛機軟件。要求是掛個三四天沒事,不會報錯。開始的時候都是順利的,所有步驟都是可以ok。但是當測試運行的是就出現問題了,內存居然會在一個Task跑完之后暴漲幾M的內存。開了一臺測試機測試了一天,內存持續泄漏,毫無停止的跡象。測試機4G的內存基本跑完。檢測后發現的調用的組件問題,應該的調用的C++組件自己沒有釋放資源。這個問題一共持續了兩個禮拜。期間嘗試了各種方法,GC和Marshal都用了,還是無果。最后用了用了笨辦法,不去刻意的創建那些對象,一直使用一個對象,然后單對象跑,測試后發現內存正常了,有正常的回收。
說實話,我對.NET的GC還是很相信,還是認為靠譜的,但是在內存泄漏面前,這些都是浮云。GC管理不到他們(這些調皮的家伙),我嘗試用Marshal去釋放句柄,結果也是一樣,不管是COM創建的還是其他,一直是增長的。
說一句Dispose也好Destroy也罷,Close也行,其實我都用上,最后我還設了對象為null。最后不管其他還是GC。還是提醒自己,.NET雖然安全,GC也是靠譜,但是自己對內存這件事也是要看重,我是對C++的那些內存束手無策了。很多人說誰創建的誰釋放,但是對于一些封裝的組件,內存泄漏了就很難入手。其實托管的對象,只要別寫的太水,GC還是很強大的,至少編譯器在編譯成IL的時候已經做了處理。當然如果真的相對垃圾回收有確切的認識,可以自己建一個項目去監控自己的內存,去確切的體會。看百遍書不如實踐測試來得有效。
新聞熱點
疑難解答