新聞速報

        

2023年4月12日 星期三

VS2019 為32位.net程序開啟記憶體地址拓展突破2G記憶體限制



VS2019 建置後事件命令列

試過作者提供的 指令字串 (我的環境 還是無法建構成功)

call "%VS160COMCOMNTOOLS%\VsDevCmd.bat" && editbin /largeaddressaware $(TargetPath)




後來改寫指令字串 (我的環境可以成功建置)

call "$(DevEnvDir)..\tools\VsDevCmd.bat"

editbin /largeaddressaware "$(TargetPath)"




PS: EDITBIN 為 Visual C++ 附屬工具,Visual Studio 記得要安裝 Visual C++ 才有的用










原版資料來源: https://www.licorne.ink/2021/11/32bit-program-mem-limit/

32位的.net程序在默認情況記憶體佔用限製為2G,而在實際使用過程中,佔用超過1.3G左右(個人觀察)就容易出現記憶體不足的報錯甚至直接崩潰。而VS系列IDE附帶的命令列工具其實提供了記憶體地址拓展功能,可以突破該限制使用4G左右的記憶體。

命令列工具位於VS安裝目錄下的一個資料夾,可以通過打開Windows的系統變數窗口來確定該資料夾的系統級環境變數(以“%”開頭和結尾,可以在路徑中作為變數使用),比如下圖為Win11 + VS2019的組合的環境變數:“%VS160COMCOMNTOOLS%”。Win11 + VS2019 的系統環境變數

具體工具的呼叫批處理檔案名稱為“VsDevCmd.bat”,請注意,在VS2015及之前的版本中,該檔案名稱為“VsVars32.bat”。

為了避免每次工程生成後需要手動呼叫,可以在項目的屬性中,生成事件選項卡的“建置後事件命令列”中新增如下命令(路徑請自行修改):


call "%VS160COMCOMNTOOLS%\VsDevCmd.bat" && editbin /largeaddressaware $(TargetPath)

其中“$(TargetPath)”會自動指代生成的32位程序。

組態完畢後,每次生成工程成功後,會自動呼叫命令列工具給程序拓展記憶體地址,在輸出欄中,如果出現一下資訊,可以視為呼叫成功:


4>
4> ** Visual Studio 2019 Developer Command Prompt v16.11.5
4> ** Copyright (c) 2021 Microsoft Corporation
4>
4> Microsoft (R) COFF/PE Editor Version 14.29.30136.0
4> Copyright (C) Microsoft Corporation. All rights reserved.
4>
========== 全部重新生成: 成功 4 個,失敗 0 個,跳過 0 個 ==========

修改成功與否,可在程序啟動的部分中加入以下程式碼,查看偵錯介面的記憶體佔用情況。


try
{
int count = 100000000;
List lst = new List(count);
for (int i = 0; i < count; i++)
lst.Add(new int[1000000]);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

下面兩張圖依次為未啟用和啟用後的記憶體佔用情況,若啟用後彈窗時佔用能夠達到4G左右,則說明修改生效。未啟用記憶體地址拓展的記憶體佔用啟用記憶體地址拓展後的記憶體佔用

沒有留言:

張貼留言