對于WEB程式來說,它寄宿在IIS提供的w3wp程序中,這個程序占用的記憶體大小和你的應用程式的使用有個直接關系,你的程式寫的标準,它占用記憶體就相對低,你的程式寫的僞範規,該釋放的東西不讓系統釋放(有些對象GC回收不了),就會造成記憶體使用過高的情況,對于32位系統來說,最高1.6G,超過後,程序自動挂掉!
對于本地服務來說,一般我們采用windowService,windowform來承載,它會自己有一個程序,而最近,我的windowService占用記憶體過高的問題真的出現了,不到5分鐘,程序已經達到500多兆了,而且還在處理遞增長的趨勢,當我們review代碼後,發現了一個大問題,看下面代碼您是否也發現了呢,代碼裡的壞味道
上面的代碼,聲明了兩個全局變量lockObj和IBigRepository,其中這個IBigRepository在方法Execute被調用,并用是輪訓調用,為了避免并發沖突,采用了lock進行排它鎖的設計,當這個全局對象本應該在程式運作結束後,就被釋放,但是,我們去想,如果線程1正在執行lock裡的代碼,而線程2這種由于輪訓服務,也開始進入方法,這時IBigRepository對象沒有被釋放,線程2又産生了一個新的對象,這時,我們的IBigRepository對象就越來越多,導緻你的記憶體消耗越來越大!
正确的作法應該是,将IBigRepository對象聲明在Execute方法裡,作為局部變量,當lock結束後,就會被系統自動加收,下一個線程2進來後,才會建立新的IBigRepository對象,這樣,我們就儲存了,在輪訓服務中,始終隻有一個IBigRepository對象被建立,這種設計才是正确的.
看一下修改後的代碼
在修改了程式之後,再看一下記憶體,隻有200M,而且沒有遞增的趨勢,這才是正确的程式,是以說,有些基礎知識很重要,我們不應該去忽視它,就像老趙說過一句話:學好作業系統才能寫出好的windows程式,學習IIS運作機制,才能寫出好的WEB程式!