2016-08-02 17 views
-1

我有一個C#應用程序在過去幾周運行。當我第一次啓動它時,它有大約10000K的內存使用量。從那以後,我已經檢查過了,它的內存空間大約爲20000K。垃圾收集現在應該運行嗎?

我不知道的.Net垃圾收集得非常好,但是這是一個標誌,我肯定有內存泄漏? GC現在不應該運行嗎?

我讀過進入垃圾收集在這裏:

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

而且他們有GC的時候應該運行以下條件:

  • 該系統具有低的物理內存。 (I有超過的存儲器70000K左使用,因此這不應該被觸發)

  • 所使用的分配對象在託管堆上 存儲器超過可接受的閾值。隨着流程運行,此閾值連續調整 。 (你如何定義「可接受」的門檻?)

不應該我希望GC在幾個星期的時間跨度已經運行?

+1

最常見的原因是人們認爲.NET未在收集垃圾是他們誤會了什麼任務管理器顯示他們和.NET如何管理堆。僅僅因爲_your_程序的直接內存消耗量減少了,這並不意味着.NET已將內存提供給Windows。或者,也許你確實有內存泄漏。誰知道?你沒有提供好的[mcve]。 –

+0

要驗證是否存在內存泄漏,請不要使用任務管理器。而是使用適當的內存分析器。有一個來自Visual Stuidio。 – jetstream96

+0

從沒有運行垃圾收集器的10MB到20MB只能在服務器級機器上運行。對於一個典型的C#程序來說,這是一個非常低的內存量,使用機器上可用的內存有效地是使代碼運行速度更快的最佳方式,CLR最好利用它。看起來你的程序並沒有給它很多機會。只有當它能夠持續攀升至1.5千兆字節時,纔會有泄漏。你需要調整你的耳朵之間的閾值:) –

回答

0

不應該我希望GC在幾個星期的時間跨度已經運行?

不,你不應該指望GC.Collect及時發生。

  • 該系統具有較低的物理存儲器:當滿足下列條件之一是 真會發生

    垃圾收集。

  • 所使用的分配對象在託管堆上存儲器超過可接受的閾值。隨着流程運行,此閾值連續調整
  • GC.Collect方法被調用。在幾乎所有情況下,您不必調用此方法,因爲垃圾收集器連續運行 。此方法主要用於獨特的情況 和測試。

瞭解更多fundamental的詳細信息。