32位Exe程序突破系統內存限制


使用場景: 自己的32位exe需要占用1.6G內存的使用,在Win7 64位環境中,由於系統內存限制,無法申請到這些內存,發生崩潰!

//

我自己使用的代碼模板:

  1.  
    //第一步,進入目錄
  2.  
    C:\ Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build
  3.  
     
  4.  
    //命令行執行,進入環境
  5.  
    vcvars32.bat
  6.  
     
  7.  
    //命令行執行,設置32位exe操作大內存
  8.  
    editbin /largeaddressaware D:\Qt597\Demo.exe
  9.  
     
  10.  
    //命令行執行,查詢是否完成: Application can handle large (>2GB) addresses
  11.  
    dumpbin /headers D:\Qt597\Demo.exe

 

//

一種臨時的解決方案如下:

 

//

參考網文地址如下:

關於c# 在vs2013 x86平台上開辟大內存

32位程序2G內存限制的解決方案

利用Visual Studio為X86程序開啟大內存的方法

 

 

以下轉載的主要內容:

注意 
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
--------------------- 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM