DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

posted on   DoubleLi  阅读(3659)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2019-01-29 Linux中的configure,make,make install到底在做些什么
2019-01-29 cmake中添加-fPIC编译选项方法
点击右上角即可分享
微信分享提示