簡體   English   中英

C# 內存使用過多

[英]C# Too Much Memory Usage

我有一個過程,其中包含多個步驟。 (假設策略模式的通用實現),其中所有步驟都傳遞一個公共 ProcessParameter 對象。 (讀/寫)

此 ProcessParameter 是一個具有許多數組和集合的對象。 例子:

class ProcessParameter() {
   public List<int> NumbersAllStepsNeed {get; set;}
   public List<int> OhterNumbersAllStepsNeed {get; set;}
   public List<double> SomeOtherData {get; set;}
   public List<string> NeedThisToo {get; set;}
   ...
}

一旦這些步驟完成,我想確保內存被釋放而不是閑逛,因為這可能會有很大的內存占用並且其他進程也需要運行。

我是否通過運行來做到這一點:

pParams.NumbersAllStepsNeed = null;
pParams.OhterNumbersAllStepsNeed = null;
pParams.SomeOtherData = null;
...

或者應該 ProcessParameter 實現 IDosposable,而 Dispose 方法會做到這一點,然后我只需要使用pParams.Dispose() (或將其包裝在 using 塊中)

清理一個正在運行的進程的已用數據的內存占用的最佳和最優雅的方法是什么?

使用數組而不是列表會改變什么嗎? 還是混合? 我需要的實際參數類型是自定義對象的集合/數組。

我在尋找正確的方向嗎?

更新

好問題! 感謝您的評論! 我曾經將這個進程作為單次運行運行,我可以看到內存使用率非常高,然后逐漸下降到“正常”。

當我開始使用不同的說明參數將這些過程相互鏈接時,問題就出現了。 那是內存異常高的時候,所以我想在兩個進程之間加入一個清理步驟,並尋找最好的方法來做到這一點。

有一個數據庫,這個參數是一種“緩存”來加快速度。

IDisposable 的優點,我不會在 params 對象中保留非托管資源。

雖然使用 Disposal 模式是一個好主意,但我認為它不會在釋放內存方面給您任何額外的好處。

兩件事可能:

  1. 調用 GC.Collect()

但是,我真的不會打擾(除非您遇到內存不足的異常)。 顯式調用 GC.Collect() 可能會損害性能,而垃圾收集器本身確實做得很好。 (但請參閱 LOH - 下面。)

  1. 注意大對象堆 (LOH)

您提到它使用“大內存占用”。 請注意,85,000 字節或以上的任何單個內存分配都來自大對象堆 (LOH)。 LOH 不會像小對象堆那樣被壓縮。 這可能導致 LOH 變得碎片化,並可能導致內存不足錯誤,即使您有足夠的可用內存。

你什么時候可能會誤入 LOH? 任何 85,000 字節或更多的內存分配,因此在 64 位系統上將是具有 10,625 個或更多元素的任何數組(或列表或字典)、圖像處理、大字符串等。

有助於最大限度地減少 LOH 碎片的三種策略:

一世。 重新設計以避免它。 並不總是實用的。 但是列表列表或字典字典可能會避免這種限制。 這會使實現更加復雜,因此除非您確實需要,否則我不會這樣做,但從好的方面來說,這可能非常有效。

ii. 使用固定尺寸。 如果 LOH 中所有更多的內存分配大小相同,那么這將有助於最大程度地減少任何碎片。 例如,對於字典和列表,將容量(設置內部數組的大小)設置為您可能使用的最大大小。 如果您正在進行圖像處理,則不太實用。

三、 強制垃圾收集器壓縮 LOH:

System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;   
GC.Collect();

您確實需要使用 .NET Framework 4.5.1 或更高版本才能使用它。 這可能是最簡單的方法。 在我自己的應用程序中,我有幾個實例,我知道我會誤入 LOH 並且碎片可能是一個問題,我設置

System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;

作為析構函數中的標准 - 但只有在分配時出現內存不足異常時才顯式調用 GC.Collect() 。

希望這可以幫助。

暫無
暫無

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

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