asp.net 應用佔用內存過大如何排查?

公司里有幾個應用,偶爾會出現內存佔用非常大的情況,都是內部辦公應用,使用的人不是很多,但是出現內存佔用非常大的情況。我使用dotmemory時出現過非常奇怪的現象:一獲取快照,內存佔用全都降下來了,拿不到非常有用的數據,很苦惱。請問各位遇到過這種問題嗎?如何排查問題所在?


Memory profile 的過程 都是先強制GC一下,然後看看所有的對象的引用 Map1, 然後重複運行目標流程N次,再強制gc一下, 看看對象的引用Map2

如果目標流程有內存泄漏,那麼 Map2 -Map1 的對象一般就是內存泄露的內容。

不做強制GC就會有大量的無關臨時對象加入比較 會混淆結果。

你只做了第一步 沒有做第二步,所以等於你根本沒做內存分析。

------------------

這個過程vs2013 已經可以完全自己完成了 不需要額外的工具的樣子,

最多你在網站裡面加一個強制gc的按鈕,按下去就可以用任務管理器抓dump了,

第一個dump用一個vs 打開,進入內存debug模式就可以比較另一個dump

-------------------

如果沒有內存泄漏,那麼就是可回收的內存, 在需要內存的時候會自動GC,所以不需要擔心

但是要注意自己是不是有太多拼string 的操作, 或開裝箱的操作,這樣會產生很多臨時的無根對象,造成內存垃圾。畢竟GC也不是免費的,但這不是Memory的真實消耗 反而是cpu消耗


這種么,基本就是分配太快來不及回收或是GC還不覺得有必要回收,你可以試試加個force GC的功能,執行下估計內存也能降。

Memory Profiler除了拿快照,還可以追蹤這段時間裡分配了哪些對象,哪裡分配的,然後看看分配體積最多的是什麼對象。

再不行就adplus -hang獲取dump,用windbg慢慢分析。


Memory profile 一用,就看出來你哪些對象有一萬個個了,甚至逐漸在增而不減,最終爆表。建議你找個處理器好些內存大些的電腦來抓dump進行測試。曾經我也為這個問題困擾


dump


推薦閱讀:

Python可以視作同時支持像C++一樣的RAII特性,也具有垃圾回收GC的編程語言嗎?
非同步操作時的內存管理?
是否有可能發現一段內存被野指針修改了?
如何設計內存池?
為什麼調用 std::map::clear() 後內存佔用率沒有降低?

TAG:ASPNET | 內存管理 | ASPNETMVC |