关于大内存问题(1. 6G)的32位程序应用程序。我在win7 64系统上测试过
Visualstudio10
int* Test=new int[1024*1024*200]; int* Test2=new int[1024*1024*200];
申请1. 6G RAM。
投掷:
cpptest 2. exe中的0x770e15ee存在未处理的异常:
Microsoft C ++异常:内存位置0x0044f660上的std :: bad_alloc。
这只是一个简单的测试。我进行了三维模拟。.内存需要使用大约2G-4G。.如何在64位系统上的32位程序中申请大容量内存。
------解决方案------------------------------------------- ----------------
32位程序不可能申请超过4G的内存。在Linux中,在X86系统下,理论上用户模式可以申请3G内存(内核保留1G地址空间),而内核模式可以申请4G内存。对于Windows,您需要检查“检查系统规格”。
------解决方案------------------------------------------- ----------------
在32位操作系统下,使用文件读写来模拟内存读写是使用4G以上内存的唯一方法。
Reference_lseeki64
在Windows 32位操作系统中,每个进程可以使用的最大空间(包括操作系统使用的内核模式地址空间)为4GB。通常情况下,操作系统将分配2GB的内存供进程使用,其他2GB的内存是为操作系统保留的,例如已安装64GB的内存,SQL / Exchange / ISA / IIS...。 。安装在服务器上,则每个进程(SQL / Exchange / ISA / III)可以使用的最大空间通常为2GB,但是Microsoft允许通过以下方式将操作系统保留的2GB内存减少到1GB:在boot.ini中添加/ 3GB参数,从而将分配给该进程的内存增加到3GB。
如果他希望应用程序使用更多的内存,则需要将其操作系统和应用程序迁移到64位平台。
有关具体说明,请参见以下文章
进程地址空间
所有32位应用程序都具有4 GB的进程地址空间(32位地址最多可以映射4 GB的内存)。对于Microsoft Windows操作系统,应用程序可以访问2 GB的进程地址空间,这称为用户模式虚拟地址空间。应用程序拥有的所有线程共享相同的用户模式虚拟地址空间。剩余的2 GB为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从Windows 2000 Server开始,包括Windows Server 200 3))都具有boot.ini开关,该开关可以为应用程序提供对3 GB进程地址空间的访问权限,从而将内核模式地址空间限制为1 GB。

地址窗口扩展(AWE)通过允许访问尽可能多的操作系统来支持物理内存来扩展32位应用程序的功能。 AWE可以将一部分最大存储容量64 GB映射到用户地址空间以实现此功能。通过操作Windows虚拟内存表,可以完成应用程序缓冲池与AWE映射的内存之间的映射。
为了支持3 GB的用户模式进程空间,必须将/ 3gb参数添加到boot.ini文件中并重新启动计算机,以使/ 3gb参数生效。设置此参数后,用户应用程序线程可以寻址3 GB的进程地址空间,而1 GB的进程地址空间是为操作系统保留的。
注意:
如果计算机上的可用物理内存超过16 GB,则操作系统需要2 GB的进程地址空间供系统使用,因此它只能支持2 GB的用户模式地址空间。为了使AWE使用超过16 GB的内存,请确保boot.ini文件中没有/ 3gb参数。否则,操作系统不能寻址超过16 GB的内存。
.Net应用程序如何在32位操作系统下申请超过2G的内存。尽管AWE方法可以访问2G以上的内存,但是它也存在一些问题。首先,您必须锁定内存,然后需要编写自己的内存管理程序。若要管理此内存,.net框架无法在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企业版
Windows Server 2003,数据中心版
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
Windows NT Server 4. 0,企业版
Windows VISTA,Windows 7和Windows Server 2008也支持此开关
查看详细信息
设置后重新启动系统,则该应用程序可以申请超过3G的内存。一切似乎都在这里结束了,但事实并非如此。
当我运行在.net框架下创建的测试程序时,我发现打开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垃圾收集器在工作时需要复制活动对象,并且.net框架需要为其保留一定的内存量才能完成这些复制任务。因此,Microsoft建议将应用程序内存分配的上限设置为800M。
如何优化.net应用程序的性能,请参考下面的链接。如果您有兴趣,可以去看看。我不会在这里谈论它。距离主题有点远。
++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ +++++++++
4G内存**-如何使用4GB(打开3GB和PAE)
Windows Vista是一个非常消耗资源的操作系统,尤其是内存。为了提高系统性能,最简单,最有效的方法是为系统扩展尽可能多的内存。 Windows 7当然也不例相比。而且,尽管Win7 X86应该能够从内核支持PAE。当然,这还需要硬件制造商的合作,特别是CPU,芯片组和主板制造商。
另一方面,在32位Windows系统中-不仅Windows Vista / Win7,支持的4GB寻址空间分为两部分:应用程序可以使用2GB,系统使用另外2GB。内核被占用。因此,即使对于系统中安装了4GB内存的Win7,应用程序可以使用的内存也被限制为2GB,因此在某些情况下不可避免地会出现“内存不足”的情况。在这方面,尽管服务器用户可以使用Microsoft的4GT RAM调整将内核的内存起始位置移动到3GB,方法是在Boot.ini中添加“ / 3GB”开关,但分配给内核的虚拟地址空间将减少。扩展到1GB,并将应用程序可以使用的地址空间扩展到3GB,但是距离理想级别还有一段距离。
当然,如果是64位,则问题要容易得多。 Windows Vista x64可以支持从8GB(Windows Vista Home Basic)到128GB(Windows Vista Ultimate)的内存,Win7相同,不再存在类似的寻址限制。但就软件和游戏而言,64位用户应期望软件和游戏制造商提供更多支持。
附件:如何在Vista / Windows 7上启用PAE
1输入cmd:单击开始菜单,在搜索框中输入“ cmd”,然后按Ctrl + Shift + Enter(进入cmd管理员模式)
2输入以下命令BCDEdit / set PAE强制Windows,其中BCDEdit与命令行启动配置编辑器有关。使用以上命令,您可以启用物理地址扩展(PAE),以使支持的内存大于4GB
Vista / Windows 7开启3GB
由于32位Windows默认应用程序只能使用2G内存,其余部分保留给系统内核使用,因此必须打开3GB
1输入cmd:单击开始菜单,在搜索框中输入“ cmd”,然后按Ctrl + Shift + Enter(进入cmd管理员模式)
2,输入以下命令bcdedit / set gainuserva 3072,使Windows为应用程序分配2G以上的内存!
补充XP和2003的打开方法:
1.打开Windows资源管理器。
2.在“工具”菜单上,单击“文件夹选项”。
3.在“查看”选项卡上,单击“显示隐藏的文件和文件夹”,清除“隐藏受保护的操作系统文件”复选框,然后单击“确定”。如果显示警告对话框,请单击“是”继续。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-360128-1.html