簡體   English   中英

Memory 泄露在.Net

[英]Memory leak in .Net

我想知道 memory 是否真的被泄露了。 我的場景是這樣的:

  1. My.Net 應用程序正在占用 x 數量的 memory。
  2. 我打開了一些對話框,現在需要 x+y 數量的 memory
  3. 關閉所有最近打開的對話框
  4. 仍然 memory 在 x + Y 左右

這是 memory 泄漏還是可能是垃圾收集器沒有清除 memory 的情況。

並且作為事件也被視為參考。 如果事件出現在取消引用的 object 中怎么辦? 那么該事件不會被視為參考,對嗎?

垃圾收集器只釋放不再引用的對象。

它不會神奇地刪除您不再需要的所有對象。

檢查您是否仍有對任何對象的引用。 請記住,事件也被視為引用。 (需要知道 object 到 go 到哪個)

Memory 僅在需要時進行垃圾收集,當所謂的第 0 代已滿或整個系統 memory 壓力足以強制進行垃圾收集時更具技術性。 Memory 出 scope 時不會自動回收。 更多信息在這里這里

只是為了測試,在關閉對話框后(不再引用它之后)嘗試調用GC.Collect() ) 以強制 GC 收集任何可用的 memory。

實際上,您應該擺弄垃圾收集器,它經過大量調整以獲得最佳性能。

如果您懷疑您確實泄漏了 memory,請使用某種 memory 分析器來分析您的應用程序。

嘗試例如RedGates Memory Profiler ,他們有一個基於時間的試驗。
按照此演練快速了解要查找的內容和方法。

In.Net 一旦你不引用 object,object 就會被收集回來。 如果您有實時參考,則 object 將保持活動狀態。 因此,要找到 memory 泄漏,您需要執行以下操作

  1. 查找對象列表和被占用的 memory
  2. 確定您懷疑現在應該釋放的對象。
  3. 找到持有此 object 的根。
  4. 修復根。

您可以使用一些 memory 分析器來執行此操作,也可以使用 WinDbg+sos。 人們覺得 windbg 很難使用,但對於這些情況,windbg+sos 更容易使用並且是免費的。 修復泄漏后,您也會感到高興。 您將成為那些總是喜歡免費強大工具的人之一。

看看這個鏈接。

http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-內存泄漏.aspx

如何使用 memory 分析工具(例如JetBrains dotTrace )來分析您的應用程序的 memory 使用情況?

可能是垃圾收集器沒有清除 memory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM