Dot-Net
1.2GB記憶體異常
我讀到了記憶體限制
我有一個應用程序可以處理需要流式傳輸的巨大圖像。就像在單幀影片處理中一樣。該應用程序有大約 40 個外掛,每個外掛都可以包含數據庫、圖像處理和 WPF GUI。
該應用程序還有 2 個使用較舊的 DotNet Winforms 的外掛。
除了應用程序在 RAM 中超過 1.2GB 之外,一切都執行良好。然後在外掛中分配新記憶體的不尋常位置上,我收到“記憶體不足異常”。
我正在開發一個編譯為 32 位的 64 位系統。我不知道該做什麼以及如何尋找任何故障。
有限制還是我可以抓住它們?
編寫一個消耗所有可用虛擬記憶體空間的 32 位程序是非常困難的。您將在 2 GB 以下碰壁,首先用完的是一塊足夠大以適應請求大小的虛擬記憶體。您只能通過小分配來達到 2GB 的限制,小到足以容納孔。
在操作點陣圖的程序中,這堵牆很早就出現了。他們可以消耗大量的 VM 來儲存點陣圖像素,並且它需要是一個連續的分配。它們儲存在一個
array,而不是一個tree。這是一種非託管記憶體分配,典型的 .NET 記憶體分析器往往無法向您展示問題。對於地址空間碎片,您無法做任何合理的事情,應該可以消耗所有可用 VM 的想法是錯誤的。
editbin.exe通過在建構後事件中執行並使用其/LARGEADDRESSAWARE命令行選項,您可以在 64 位作業系統上獲得更多喘息空間。這允許該程序使用可用的 4 GB 的 VM,這是一個特定於 64 位版本的 Windows 的選項,並且可能因為 Windows 不需要上面的 2 GB。當然,將平台目標更改為 AnyCPU 是獲得大量虛擬記憶體的快速簡便的方法。