[英]C# Memory Issues
我有一個應用程序,它:
在具有多個繪圖的作業中使用了幾個小時后,該應用程序最終耗盡了內存。 根據性能計數器,我花了很長時間來清理代碼中發現的許多漏洞,並使該項目進入一種狀態,在最壞的情況下,該狀態在任何給定時間都可能使用多達40萬個內存。 由於數據是在鋸齒狀數組中處理的,因此處理此數據目前還沒有產生任何問題,從而避免了大對象堆的任何問題。
上一次發生這種情況時,用戶正在使用〜305,000K的內存。 該應用程序是如此“內存不足”,以致於錯誤對話框甚至無法在出現的MessageBox中繪制錯誤圖標,該圖標通常通常為黑色的空間。
到目前為止,我已經完成了以下清理工作:
到目前為止,幾乎我以前提到的每篇文章都表明,內存不足實際上意味着連續的地址空間不足,並且鑒於已使用的數量,我同意這一點。 我不確定此時該怎么做,因為據我了解(可能是很錯誤的),垃圾收集器會在進程進行過程中清除此空間以騰出空間,但LoH除外。現在,使用.net 4.5.1中引入的新LargeObejctHeapCompactionMode屬性手動進行清理。
我在這里想念什么? 由於舊的32位庫包含專有算法,因此我無法構建64位,甚至我們夢dream以求地產生64位版本的庫也無法訪問。 我應該使用這些配置文件中的任何模式來准確識別此處超出控制范圍的情況嗎?
如果無法清除此地址空間,是否表示所有c#應用程序最終將因此而“用盡內存”?
到目前為止,幾乎我以前提到的每篇文章都表明,內存不足實際上意味着連續的地址空間不足,並且鑒於已使用的數量,我同意這一點。
這是一個合理的假設,但即使是合理的假設也可能是錯誤的。 你的可能是錯的 。 你該怎么辦?
用科學進行測試 。 也就是說,尋找可以證偽您的假設的證據。 您想假設這是其他任何東西 ,並受到您所收集的證明您的假設不成立的證據的強迫。
所以:
還有什么其他證據證明該假設可能是錯誤的?
所有這些聽起來都不是內存不足的問題。 這聽起來像第三方控件庫泄漏了圖形對象的OS句柄。 不幸的是,此類泄漏通常會以“內存不足”錯誤而不是“超出句柄”錯誤的形式出現。
因此,這是一個新的假設。 還要尋找支持和反對該假設的證據。 通過使用內存分析器,您做得很好。 接下來使用句柄分析器 。
如果無法清除此地址空間,是否表示所有c#應用程序最終將因此而“用盡內存”?
不。 GC在清理托管內存方面做得很好。 許多應用程序永遠運行不會泄漏而不會出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.