c# 內存泄漏檢查心得


系統環境 windows 7 x64

檢查工具:ANTS Memory Profiler 7 或者 .NET Memory Profiler 4.0

開發的軟件為winform / windows service 形式,form配置task和trigger ,service使用quartz定時調度任務。

框架:.net framework 4.0/4.5  

可能有內存泄漏問題組件:

  1. npoi 2.0.1
  2. System.Data.SQLite.1.0.88.0  准備升級致  System.Data.SQLite.1.0.89.0
  3. quartz.net

quartz.net 中有 dbcommond 沒有dispose 會造成SqliteParameter中的托管內存未釋放

connection只進行close,未dispose也會造成內存泄漏

   

檢查出的內存泄漏對象

  1. Process.GetCurrentProcess() 在commonlogging中頻繁調用,居然占用很大內存,20分鍾有83萬個對象之多,有49個對象未釋放。后改為靜態變量引用獲得的當前線程
  2. IUnityContainer container = GetOrCreateSessionWrapper().unity.CreateChildContainer();

    也許是設計上的bug,在web下,session request各有自己的ioc容器, 且為父容器與子容器的關系,而在winform下,Context的request和session寫成沒有緩存時,會在每次調用時創建,造成頻繁創建子容器,而又無法象web一樣釋放request級別的所有對象。

  3. 查了2個多星期,交付日期越來越近,更新到quartz.net 2.2 ,quartz net 2.2中仍有 IDbCommond 沒有dispose 會造成SqliteParameter中的托管內存未釋放
  4. quartz.net 2.2 重寫jobstore,獲取idbconnection時從線程緩存中獲取,並且不關閉connection, 這樣可以避免 Sqlite3, List<SQLiteFunction>對象不斷變大的問題。
  5. 過程中也發現有大量非托管內存泄漏,也可以嘗試 Marshal.Clean..的相關方法釋放(目前還沒有辦法驗證)。

   

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM