允許 32 位元應用程式使用 2GB 以上的記憶體


目前大部分的電腦系統,應該都已經從 32 位元轉換到 64 位元了,所以在開發應用程式的時候,其實在一定的程度上,可以「揮霍」記憶體。(笑

但是,有的時候受限於第三方函式庫,可能還是需要建置 32 位元的程式;實際上,Heresy 這邊最近就有碰到,因為廠商硬體的驅動程式的原因,無法把程式建置成 64 位元的版本。

而只能建置成 32 位元的最大問題,就是記憶體使用量大幅變小了…

基本上,在 Windows 環境下,32 位元的應用程式能使用的記憶體,最大就是 1.6GB 左右了;如果程式向系統要求要求超過 1.6GB 的記憶體,就會出錯了。

解決方法呢?基本上就是要自己去處理 swap 了。

不過,最近看到了《突破 32 位元 .NET 程式 2GB 記憶體上限》這篇文章後,這才發現,原來 Visual C++ 提供的「Editbin」(MSDN)這個小工具,可以用來修改編譯出來的執行檔,允許 32 位元的程式,使用更多的記憶體!

官方的說明是:

Microsoft COFF 二進位檔案編輯器 (EDITBIN.EXE) 可修改通用物件檔案格式 (Common Object File Format,COFF) 的二進位檔案 (Binary File)。
您可使用 EDITBIN 來修改目的檔 (Object File)、可執行檔和動態連結程式庫 (DLL)。

而他的使用方法也非常簡單,只要開啟一個 Visual Studio 的命令提示字元,然後執行:

editbin.exe /LARGEADDRESSAWARE <執行檔名稱>

他是去修改現有執行檔,所以是要先編譯出來,再透過這個工具程式去修改他的資料,所以執行完後,並不會產生新的檔案;所以保險一點,最好先備份一下這個執行檔。

這樣執行成功的話,這個 32 位元程式的執行檔,就可以使用超過 2GB 的記憶體了!

Heresy 這邊的程式在測試的時候,是發現本來使用超過 1.6GB 記憶體就會當掉的程式,現在可以用到 3.5GB 左右了~感覺上,可用記憶體量大概是變成兩倍左右了。

本來 Heresy 還在擔心他是說 .Net 的程式可以用,不知道 native C++ 的程式可不可以用?不過看起來 native C++ 的程式應該也是沒問題的~

雖然在可使用的記憶體量上還是比不上 64 位元的程式,但是如果因為各式的原因、只能使用 32 位元的話,也算是不無小補了。


而如果是自己的 Visual C++ 專案的話,其實也可以直接透過設定專案的方法,來開啟這項功能。

這個選項是在專案屬性的「連結器」(Linker)的「系統」(System)這一頁裡;將「啟用大型記憶體」(Enable large addresses)改成「是」(Yes (/LARGEADDRESSAWARE))就可以了。

(上圖實際上是 64 位元的專案,不過還是有這個選項。)


附註,Visual C++ 還有提供一個「dumpbin.exe」的工具(MSDN),可以用來檢查執行檔是否有開啟支援 2GB 以上的記憶體定址。他的命令是:

dumpbin.exe /LARGEADDRESSAWARE <執行檔名稱>

執行後他會顯示多資訊,而在最上方、「FILE HEADER VALUES」中有顯示「Application can handle large (>2GB) address」

對「允許 32 位元應用程式使用 2GB 以上的記憶體」的想法

  1. 指令有誤
    dumpbin.exe 沒有 /LARGEADDRESSAWARE 的參數選項
    我是用 dumpbin /headers devenv.exe | more

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.