新聞速報

        

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左右,則說明修改生效。

未啟用記憶體地址拓展的記憶體佔用
啟用記憶體地址拓展後的記憶體佔用

沒有留言:

張貼留言