2010-11-07 44 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

相关问题