作者: 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. 获取当前的 viewController

    - (UIViewController *)currentController {    UIViewController *result = nil;    UIWindow *window = [ ...

  2. linux modprobe.conf怎么不见了—-CentOS 6

    用习惯了CentOS或RHEL的用户或许很熟悉/etc/modprobe.conf文件,系统声卡.网卡.SCSI卡的驱动类型都在这里定义,同样部分动态加载的模块的参数也可以在这个文件中定义,但是在Ce ...

  3. 使用ncc分析代码

    1 ncc是一个编译器, 用于输出程序的一些调用信息等, 可以查看函数调用关系, 支持函数指针, 查看数据结构和代码. 可以用来分析和理解代码. “" ... with ncc, in le ...

  4. 基于select模型的udp客户端实现超时机制

    参考:http://www.cnblogs.com/chenshuyi/p/3539949.html 多路选择I/O — select模型 其思想在于使用一个集合,该集合中包含需要进行读写的fd,通过 ...

  5. PySpark调用自定义jar包

    在开发PySpark程序时通常会需要用到Java的对象,而PySpark本身也是建立在Java API之上,通过Py4j来创建JavaSparkContext. 这里有几点是需要注意的 1. Py4j ...

  6. Strassen算法

    如题,该算法是来自德国的牛逼的数学家strassen搞出来的,因为把n*n矩阵之间的乘法复杂度降低到n^(lg7)(lg的底是2),一开始想当然地认为朴素的做法是n^3,哪里还能有复杂度更低的做法,但 ...

  7. Redhat=》中文

    我的redhat安装时没有提示语言选项,由于工程需要,支持汉字是不可避免的,因此就必须安装中文输入法. 安装中文包 将系统光盘镜像文件连接至计算机,我的镜像是RHEL5.1的,先将光盘挂载至/mnt目 ...

  8. JQuery点击收起,点击展开以及部分非空小验证

    <tr> <td nowrap align="right" width="18%"> 解决方案: </td> <td ...

  9. oracle学习 二(持续更新中)

    oracle数据库的启动停止 以oracle用户身份登录 登录后输入以下命令: oracle-> sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Pro ...

  10. hdu 4115 Eliminate the Conflict ( 2-sat )

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...