2010-11-07 46 views
2

我總是編譯我的delphi應用程序而沒有使用運行時包構建,但是對於我最新的項目,我不得不使用它(因爲它一天天開始膨脹)。我使用了一些第三方VCL(源代碼的TMS組件包,源代碼目錄也在搜索路徑中),如何使我的程序在使用運行時軟件包構建時使用更少的內存?

當我編譯時使用運行時包構建整個bpl包在運行時被應用程序使用(否則它只符合根據windows任務管理器,我認爲它會消耗很多內存(通常我的應用程序使用38 Mb內存,但現在是62 Mb(不僅我也使用了許多其他的VCL)。

有什麼辦法可以讓我的應用程序像編譯爲單個exe一樣消耗低內存。

(我知道,只有需要的VCL(我有源)重新編譯VCL包,但它是太難挖源,找出需要VCLS和子程序)

+0

您從哪個任務管理器列中獲取內存讀數? – 2010-11-07 16:12:28

+0

爲什麼在編譯時啓用運行時包?我並不反對它,但它肯定會增加安裝程序的大小,所以也許你想重新考慮它是否是你想要的。內存中使用它的主要好處是,多個應用程序在同一臺機器上同時運行,並使用相同的Delphi編譯器和組件版本。如果是你的情況,我建議你不要擔心單個應用程序的內存使用情況。 – jachguate 2010-11-08 17:13:08

回答

8

我認爲你正在測量錯誤的東西。儘管包文件更大,但這並不一定意味着您的程序在RAM中佔用更多空間。編譯器必須包含程序包中所有函數和單元的代碼,而不管程序使用哪個部分,但這並不意味着所有代碼都被加載到內存中。操作系統將加載它需要的頁面;其餘的將繼續駐留在磁盤上,它來自它的BPL文件。整個BPL文件將佔用地址空間,但它不會被加載到物理RAM中,因此除非您真的有使用操作系統授予您的進程的整個2 GB地址空間的危險,否則不必擔心。 。

+0

真的嗎?我以爲DLL被加載爲內存映射文件。而每個WIN32進程最多隻能有2GB或3GB的內存。因此,加載大包的數量超過了這個最大內存限制。儘管它們實際上並沒有裝載在物理內存中,但它們卻超出了限制。對? – 2010-11-08 14:48:58

+0

是的,真的@Workshop。你寫的和我已經說過的完全一樣。由於整個BPL不會被加載到RAM中,所以您不必擔心它的大尺寸會佔用RAM中其他內容的空間。但整個BPL *佔用地址空間,總共2 GB(或很少,3)。但是如果你有*需要*整個地址空間的危險,那麼你只需要擔心這一點,而這可能不是你需要的。 – 2010-11-08 15:14:02

0

包是DLL文件,它們需要加載到內存中才能工作。並且每個軟件包將包含它的所有單元的代碼。因此,他們可以使用更多的內存,而不是使用包含運行時包的exe文件 - 儘管您的增加看起來有點過大。另一方面,如果您的應用程序使用相同的軟件包而且安裝正確,那麼它們的代碼將一次加載到內存中。 你可以構建ad-hoc包,但是你應該非常小心地使用標準包中的不同名稱,或者可以打破其他一些應用程序,尤其是當你將包放在共享位置或者放在路徑。 在嘗試它們之前,我會檢查你的應用程序沒有鏈接未使用的軟件包。德爾福將把選項或多或少地放入它所知道的所有軟件包中。您可以在編譯後檢查哪些軟件包真的被使用,並將它們僅添加到要使用的軟件包列表中。

+1

爲了找出真正使用哪些軟件包,他必須編譯(不僅僅是編譯)該項目,然後轉到Project | <項目名稱>的信息。 – vcldeveloper 2010-11-07 15:37:16

+1

包未完全加載到內存中才能正常工作。它們是由操作系統加載頁面的DLL,它只加載實際使用的頁面。 – 2010-11-07 19:38:25

相關問題