使用場景: 自己的32位exe需要占用1.6G內存的使用,在Win7 64位環境中,由於系統內存限制,無法申請到這些內存,發生崩潰!
//
我自己使用的代碼模板:
-
//第一步,進入目錄
-
C:\ Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build
-
-
//命令行執行,進入環境
-
vcvars32.bat
-
-
//命令行執行,設置32位exe操作大內存
-
editbin /largeaddressaware D:\Qt597\Demo.exe
-
-
//命令行執行,查詢是否完成: Application can handle large (>2GB) addresses
-
dumpbin /headers D:\Qt597\Demo.exe
//
一種臨時的解決方案如下:
//
參考網文地址如下:
以下轉載的主要內容:
注意
1.內存開啟成功的標志:在查看結果中的”FILE HEADER VALUES”段落中,會出現”Application can handle large (>2G) addresses”字樣;
2.當程序重新編譯后,原有的大內存信息會丟失,所有需要重新開啟;
3.在程序中,只需要針對執行文件開啟大內存即可,其他的文件非執行文件不需要再開啟。
1 問題描述
目前公司的很多程序需要在32位模式下運行,有些項目的相關系統容易遇到內存溢出的問題,系統在使用過程中不太穩定。通過分析得出,默認情況下,32程序的內存地址空間只有2G,這2G內存除了存儲程序數據外還需要存儲程序本身,根據經驗,程序一旦使用超過1G的內存就不太穩定。
2 解決方案
2.1 方案一:進程拆分
將程序中耗內存的功能拆分成單獨的進程。此方法在目前的各個項目開發中正在使用。但有時候會出現功能無法拆分(如數據瀏覽),或拆分后還出現主進程較長時間使用還是出現內存溢出的問題。所以此方案還不能完全解決這個內存溢出的問題。
2.2 方案二:突破2G限制
通過開啟/largeaddressaware 的方式突破單進程2個G的限制(理論最大4G 虛擬地址空間)。
2.2.1 操作方法
具體操作方法:
方法1:在命令行依次執行以下幾行命令
cd C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\bin
vcvars32.bat
editbin /largeaddressaware xx.exe
方法2:在VS (以VS2012為例)項目屬性->生成事件->后期生成事件命令行中設置如下命令行:
call"%VS110COMNTOOLS%..\tools\vsvars32.bat"
editbin /largeaddressaware$(TargetPath)
說明:方法一在每次編譯后需要執行相關命令;方法二在VS編譯后自動完成相關設置操作,使用方便。
2.2.2 測試程序
以下為測試程序的編寫示例:
測試程序:通過在exe中進行編寫以下大量分配內存的程序進行測試,將錯誤信息輸出到日志
static void Main(string[] args)
{
try
{
int count = 100000000;
List<int[]> lst = newList<int[]>(count);
for (int i = 0; i < count;i++)
{
lst.Add(new int[1000000]);
}
}
catch (Exception ex)
{
LogHelper.Error.Append(ex);
}
}
1)未突破2G限制的日志信息如下:
19:33:07:849
System.OutOfMemoryException:引發類型為“System.OutOfMemoryException”的異常。
19:33:07:855
當前專用內大小:1.69 GB
當前虛擬內存大小:1.94 GB
最大虛擬內存量:1.94 GB
物理內存總大小:4 GB
可用物理內存大小:4 GB
虛擬內存總大小:2 GB
可用虛擬內存大小:62.31 MB
交換空間總大小:4 GB
可用交換空間大小:4 GB
2)突破4G限制的日志信息如下:
19:33:45:371
System.OutOfMemoryException:引發類型為“System.OutOfMemoryException”的異常。
19:33:45:377
當前專用內大小:3.59 GB
當前虛擬內存大小:3.9 GB
最大虛擬內存量:3.91 GB
物理內存總大小:4 GB
可用物理內存大小:4 GB
虛擬內存總大小:4 GB
可用虛擬內存大小:105.38 MB
交換空間總大小:4 GB
可用交換空間大小:4 GB
2.3 結論
綜上,通過方案一和方案二相結合,能比較完美地解決32位程序內存溢出的問題(當然,如果這個程序使用過程中占用的內存達到3G以上的時候還是容易出問題,那就需要從程序本身去優化了)。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
x86平台由於其尋址空間為2^32=4GB,所以在x86平台上的程序最大只能占4GB。vs2013將x86程序限制在2GB的安全范圍內,但有時候我們需要開發>2GB的程序,如何突破這個限制呢?
在vs2013的安裝目錄下有一個程序可以修改這個限制,具體方法如下:
1.以管理員身份運行 VS2013 開發人員命令提示 工具 這個工具可以在vs的安裝目錄找到 當然 你也可以直接使用cmd
2.打開“editbin.exe” 所在目錄 這個文件在vs的安裝目錄下找到
3.輸入:editbin /largeaddressaware $(TargetPath)
如何知道自己成功開啟了大內存模式呢?vs安裝目錄下有一個 dumpbin.exe 工具 這個工具可查看exe文件的很多屬性
在上文相同的目錄下輸入 dumpbin /headers executable_file
如果能看到如下信息 則說明開啟成功
如果還沒有成功,也可用如下方法:
1.打開項目屬性,點開生成事件選項卡
2.在后期生成事件命令行中輸入:editbin /largeaddressaware $(TargetPath) (以上路徑必須是全路徑)
這個修改雖然突破了2GB的限制 但不能突破4GB的限制 這是由於x86的尋址范圍只有這么大
如果你的程序超出了4GB的限制,則需要修改為64平台,64平台理論上可支持2^64=16EB 目前64位win7最大支持128GB。如果你實在不想改成64,也可以嘗試使用內存映射文件和虛擬內存方法。具體內容請參照
http://www.cnblogs.com/criedshy/archive/2010/06/13/1757826.html
http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html
以上參考了一下內容,感謝他們的分享!
http://stackoverflow.com/questions/2597790/can-i-set-largeaddressaware-from-within-visual-studio
http://blog.sina.com.cn/s/blog_52deb9d50100ml6s.html
---------------------