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


    使用场景: 自己的32位exe需要占用1.6G内存的使用,在Win7 64位环境中,由于系统内存限制,无法申请到这些内存,发生崩溃!

    //

    我自己使用的代码模板:

    1.  
      //第一步,进入目录
    2.  
      C:Program Files (x86)Microsoft Visual Studio2017EnterpriseVCAuxiliaryBuild
    3.  
       
    4.  
      //命令行执行,进入环境
    5.  
      vcvars32.bat
    6.  
       
    7.  
      //命令行执行,设置32位exe操作大内存
    8.  
      editbin /largeaddressaware D:Qt597Demo.exe
    9.  
       
    10.  
      //命令行执行,查询是否完成: Application can handle large (>2GB) addresses
    11.  
      dumpbin /headers D:Qt597Demo.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.0VCin

       vcvars32.bat

       editbin /largeaddressaware xx.exe

    方法2:在VS (以VS2012为例)项目属性->生成事件->后期生成事件命令行中设置如下命令行:

      call"%VS110COMNTOOLS%.. oolsvsvars32.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
    --------------------- 
     

  • 相关阅读:
    [Leetcode] Rotate Image
    [Leetcode] Permutation Sequence
    [Leetcode] Palindrome Partitioning
    [Leetcode] Letter Combinations of a Phone Number
    Java里的多线程
    css学习2----css动态菜单
    css学习1----css超链接效果
    javascript判断身份证是否合法
    RMI(Remote Method Invocation,远程方法调用)
    struts.properties配置详解
  • 原文地址:https://www.cnblogs.com/lidabo/p/14343441.html
Copyright © 2020-2023  润新知