32位Exe程序突破系统内存限制

 

使用场景: 自己的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

 

//

一种临时的解决方案如下:

 

//

参考网文地址如下:

关于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 lst = newList(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)

32位Exe程序突破系统内存限制_第1张图片

如何知道自己成功开启了大内存模式呢?vs安装目录下有一个  dumpbin.exe 工具  这个工具可查看exe文件的很多属性

在上文相同的目录下输入  dumpbin /headers executable_file

如果能看到如下信息 则说明开启成功

32位Exe程序突破系统内存限制_第2张图片

如果还没有成功,也可用如下方法:

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

 

你可能感兴趣的:(32位Exe程序突破系统内存限制)