作者: eaglet

2008 年我写过一篇博客叫 《让.Net 应用程序突破2G的内存访问限制》 这篇博客主要讲述了如何在32位操作系统下利用AWE 扩展访问超过2G的内存。AWE方式虽然可以访问超过2G的内存,但其本身也有一些问题,首先必须要锁定内存,其次需要自己写内存管理程序来管理这些内 存,.net framework 无法在AWE 扩展的内存中创建托管堆。其实很多应用只是想申请比2G稍多一些的内存,最简单的方法还是采用/3GB开关来实现。本文将讲述如何利用 /3GB开关来让32位操作系统下.net 应用程序申请超过2GB的内存。

首先简单说一下这个 /3GB 开关 (知道的可以不看)

默 认情况下,Windows 可以对总计 4 千兆字节 (GB) 的虚拟地址空间进行寻址。默认情况下,此地址空间中的 2 GB 为内核(操作系统)保留,另外 2 GB 是为用户模式程序保留的。当你将 /3GB 开关放入操作系统的 Boot.ini 文件中时,你就重新分配了虚拟地址空间,给用户模式程序提供 3 GB 的空间,同时将内核限制为 1 GB。

设置办法:C:\boot.ini 文件做如下修改:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB

如下操作系统可以支持 /3GB 开关

Windows XP Professional
Windows Server 2003
Windows Server 2003, Enterprise Edition
Windows Server 2003, Datacenter Edition
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
Windows NT Server 4.0, Enterprise Edition

Windows VISTA , Windows 7 和 Windows server 2008 也支持这个开关

详见

http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx

设置完后重新启动系统,这时应用程序就可以申请超过3G的内存了。一切好像到这里就该结束了,然而并非如此。

当我运行我在.net framework 下做的测试程序时,我发现3GB开关打开后,这个测试程序依然无法申请超过2G的内存,内存申请到1.5G以上时就无法再分配内存了。

查找资料后我发现,操作系统在支持/3GB参数后应用程序也要做相应的修改,告诉操作系统可以按照/3GB方式运行才行,我想这很可能是出于对应用程序兼容性方面的考虑。

为了告知操作系统这个应用程序可以支持/3GB方式,我们需要往exe 文件头中添加一个 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志。添加的方式很简单:

在你的系统的 Program Files\Microsoft Visual Studio 8\VC\bin 目录下找到 editbin 这个可执行文件,在命令行下执行:

editbin /LARGEADDRESSAWARE yourapplication.exe 这里的yourapplication.exe 需要输入的是你的.net 应用程序的路径名加文件名。

执行了这条语句后,我再次运行测试程序,内存可以申请到 2.5G了,比2GB模式下多了1G内存可以使用。

最后多罗嗦一句,为什么.net 应用程序在 2GB 情况下只能申请最多 1.4-1.6 GB 的内存?

这是因为.net 的垃圾回收器在工作时需要拷贝 live objects,.net framework 需要为它保留一定空间的内存来完成这些拷贝工作。这也是为什么Microsoft 建议asp.net 应用程序内存分配的上限最好设置为800M的原因.

.net 应用程序如何优化性能,参见下面链接,大家有兴趣可以去看看,这里不再多说了,离主题有点远了。

Improving .NET Application Performance and Scalability

.Net 应用程序如何在32位操作系统下申请超过2G的内存【转】的更多相关文章

  1. php strtotime 在32位操作系统下的限制

    php strtotime 在32位操作系统下的限制 <?php class DateHelper{ /** * 在32位操作系统下,超过 2038-01-19 03:14:07 ,会溢出 * ...

  2. (原)解决.NET 32位程序运行在64位操作系统下的兼容性问题

    背景:一个第三方组件是C++.NET  32位开发的,后被C#(基于FrameWork4.0)调用并封装成组件,此二次封装的组件无法运行于64位操作系统上.        开发环境:VS2012:解决 ...

  3. (IStool)64位软件安装在32位操作系统时给出提示

    需求:64位的软件当在32位操作系统下安装时,需要提示用户不能在32位操作系统中进行安装 实现:打包时启用64位模式(打包工具用的是Inno Setup 5) 安装脚本段需要添加以下代码: [Setu ...

  4. Windows 64位操作系统和32位操作系统在注册表上的有一点不一样

    Windows 64位操作系统为提供对32位应用程序的兼容,在“C:\Windows\SysWOW64”目录下保留了很多32位的工具(如CMD.exe是32位的).在Windows 64位操作系统上跑 ...

  5. 64位操作系统下IIS报“试图加载格式不正确的程序”错误

    缘由:在64位操作系统下IIS发布32位的项目,报“项目依赖的dll无法读取,试图加载格式不正确的程序”错误. 原因:程序集之间的通讯要么全是64位环境下的,要么全是32位环境下的.不能混编访问.不然 ...

  6. 计算机组成原理--64位CPU装载32位操作系统,它的寻址能力还是4GB吗?

    借由这个问题,今天我们就把 32 位 CPU.64 位 CPU.32 位操作系统.64 位操作系统之间的区别与联系彻底搞清楚.对于这个问题,博主也是一知半解了好长时间啊~ 基本概念 32位的CPU与6 ...

  7. Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下

    原文:Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下 64位操作系统下拷贝文件重定向问题,在在复制代码前加上Disable(WOW64FSREDIRECTION ...

  8. 基础 - 32位操作系统最多只支持4G内存。

    32位操作系统最多只支持4G内存. CPU能不能直接访问硬盘的数据呢, 不能. 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据.我们平时玩游戏碰上读图loading 进度条的这个过程 ...

  9. 为什么32位操作系统最大支持4GB内存

    因为32位操作系统的地址空间为32位,地址总数为2^32,每个地址对应1Byte内存空间,这样,32位操作系统管理的最大内存空间限制为2^32Byte=4*1024*1024*1024Byte,即4G ...

随机推荐

  1. hihocoder 1356 分隔相同整数 简单贪心

    分析:考虑贪心,考虑填ans[i],前i-1个合法,现在剩下一些数, 那么挑出出现次数最多的数,次数为mx,当前剩余总数为sum 如果sum-mx>=mx-1那么肯定有解,这个想想就知道了(这种 ...

  2. 我常用的VBS方法(QTP)

    这些是4年前在HP用QTP做自动化测试时候总结的一些,现在贴出来,说不准以后会不会用到 当初花了2天时间写的一个自动生成的Excel Report Public Function Report (st ...

  3. 游戏BI,起步了。

    思索许久,终于决定自己的发展将会是游戏的BI. 即说即做,本文是我未来BI工作的开端. 传统的游戏BI,只是将运营的工作数据化,流量的变现指标化.和网站类似,无外乎用户导入,流失,保有,付费,回访等等 ...

  4. Windows上的的神技能,你知道几个?(Windows技巧大全,已更新)

    不用借助任何第三方软件,其实Windows也大有可为——比你目前了解得至少要多得多,强大技能快来get起来! 1.文件隐藏谁的电脑里没点小秘密?东藏西藏到最后自己都找不到了有木有?今天教大家个隐藏文件 ...

  5. ansible条件使用--实践

    ansible条件使用 1.条件使用最简单的方式 ansible中使用条件最简单的方式如下所示: [root@ansibleserver kel]# cat conditions.yml --- - ...

  6. 解决android.os.NetworkOnMainThreadException

    好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadExc ...

  7. [转]【eoeAndroid索引】史上最牛最全android开发知识汇总

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  8. QCon2013上海站总结 -- 整体印象和感悟

    基本情况: QCon 2013(http://www.qconshanghai.com/)上海站的活动一共为期3天(周五.六和日).活动在上海的光大会展中心举行的. QCon(全球软件开发者大会)是由 ...

  9. 【Hadoop代码笔记】Hadoop作业提交之Job初始化

    一.概要描述 在上一篇博文中主要描述了JobTracker和其几个服务(或功能)模块的接收到提交的job后的一些处理.其中很重要的一部分就作业的初始化.因为代码片段图的表达问题,本应该在上篇描述的内容 ...

  10. 全面理解Linux输入输出重定向

    全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解  Linux Shell 中支持输入输出重定向,用符号&l ...