.Net 應(yīng)用程序如何在32位操作系統(tǒng)下申請(qǐng)超過2G的內(nèi)存
Posted on 2010-01-20 09:24 eaglet 閱讀(6295) 評(píng)論(20) 收藏 舉報(bào)作者: eaglet
2008 年我寫過一篇博客叫 《讓.Net 應(yīng)用程序突破2G的內(nèi)存訪問限制》這篇博客主要講述了如何在32位操作系統(tǒng)下利用AWE 擴(kuò)展訪問超過2G的內(nèi)存。AWE方式雖然可以訪問超過2G的內(nèi)存,但其本身也有一些問題,首先必須要鎖定內(nèi)存,其次需要自己寫內(nèi)存管理程序來管理這些內(nèi)存,.net framework 無法在AWE 擴(kuò)展的內(nèi)存中創(chuàng)建托管堆。其實(shí)很多應(yīng)用只是想申請(qǐng)比2G稍多一些的內(nèi)存,最簡單的方法還是采用/3GB開關(guān)來實(shí)現(xiàn)。本文將講述如何利用 /3GB開關(guān)來讓32位操作系統(tǒng)下.net 應(yīng)用程序申請(qǐng)超過2GB的內(nèi)存。
首先簡單說一下這個(gè) /3GB 開關(guān) (知道的可以不看)
默認(rèn)情況下,Windows 可以對(duì)總計(jì) 4 千兆字節(jié) (GB) 的虛擬地址空間進(jìn)行尋址。默認(rèn)情況下,此地址空間中的 2 GB 為內(nèi)核(操作系統(tǒng))保留,另外 2 GB 是為用戶模式程序保留的。當(dāng)你將 /3GB 開關(guān)放入操作系統(tǒng)的 Boot.ini 文件中時(shí),你就重新分配了虛擬地址空間,給用戶模式程序提供 3 GB 的空間,同時(shí)將內(nèi)核限制為 1 GB。
設(shè)置辦法: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
如下操作系統(tǒng)可以支持 /3GB 開關(guān)
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 也支持這個(gè)開關(guān)
詳見
http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx
設(shè)置完后重新啟動(dòng)系統(tǒng),這時(shí)應(yīng)用程序就可以申請(qǐng)超過3G的內(nèi)存了。一切好像到這里就該結(jié)束了,然而并非如此。
當(dāng)我運(yùn)行我在.net framework 下做的測(cè)試程序時(shí),我發(fā)現(xiàn)3GB開關(guān)打開后,這個(gè)測(cè)試程序依然無法申請(qǐng)超過2G的內(nèi)存,內(nèi)存申請(qǐng)到1.5G以上時(shí)就無法再分配內(nèi)存了。
查找資料后我發(fā)現(xiàn),操作系統(tǒng)在支持/3GB參數(shù)后應(yīng)用程序也要做相應(yīng)的修改,告訴操作系統(tǒng)可以按照/3GB方式運(yùn)行才行,我想這很可能是出于對(duì)應(yīng)用程序兼容性方面的考慮。
為了告知操作系統(tǒng)這個(gè)應(yīng)用程序可以支持/3GB方式,我們需要往exe 文件頭中添加一個(gè) IMAGE_FILE_LARGE_ADDRESS_AWARE 標(biāo)志。添加的方式很簡單:
在你的系統(tǒng)的 Program Files\Microsoft Visual Studio 8\VC\bin 目錄下找到 editbin 這個(gè)可執(zhí)行文件,在命令行下執(zhí)行:
editbin /LARGEADDRESSAWARE yourapplication.exe 這里的yourapplication.exe 需要輸入的是你的.net 應(yīng)用程序的路徑名加文件名。
執(zhí)行了這條語句后,我再次運(yùn)行測(cè)試程序,內(nèi)存可以申請(qǐng)到 2.5G了,比2GB模式下多了1G內(nèi)存可以使用。
最后多羅嗦一句,為什么.net 應(yīng)用程序在 2GB 情況下只能申請(qǐng)最多 1.4-1.6 GB 的內(nèi)存?
這是因?yàn)?net 的垃圾回收器在工作時(shí)需要拷貝 live objects,.net framework 需要為它保留一定空間的內(nèi)存來完成這些拷貝工作。這也是為什么Microsoft 建議asp.net 應(yīng)用程序內(nèi)存分配的上限最好設(shè)置為800M的原因.
.net 應(yīng)用程序如何優(yōu)化性能,參見下面鏈接,大家有興趣可以去看看,這里不再多說了,離主題有點(diǎn)遠(yuǎn)了。
浙公網(wǎng)安備 33010602011771號(hào)