【问题标题】:Why does my application use more memory after I compress it with UPX, and what can I do about it?为什么我的应用程序在使用 UPX 压缩后会使用更多内存,我该怎么办?
【发布时间】:2012-02-09 21:42:29
【问题描述】:

我正在使用 UPX 压缩器来压缩我用 Delphi XE 编写的应用程序。文件大小从大约 32 Mb 到 8 Mb。

不过,我注意到的奇怪之处在于,运行压缩文件时 RAM 的占用显着增加。从 25/30 Mb 到大约 80 Mb。这是正常现象还是您应该保留的问题?在我的例子中,由于应用程序在具有多个用户的 Windows Server 2008 远程桌面模式下运行,因此系统的重量不成比例。

为什么会这样?我该如何解决这个问题?

【问题讨论】:

  • 有多少用户同时运行该应用程序?如果您使用压缩器,则进程的每个实例都会消耗单独的物理内存。页面无法共享。您使用 UPX 的动机是什么?
  • 我不具体了解 UPX,但至少有一些 PE 压缩器在启动时将整个图像解压缩到内存中。这与常规 PE 不同,后者根据需要将各个部分分页。
  • 您确定没有链接到可执行文件的调试信息吗?这通常比压缩对您的文件大小产生更大的影响。我的一个应用程序有 17MB 有调试信息,没有调试信息不​​到 3 个。

标签: delphi upx


【解决方案1】:

这就是 EXE 压缩器的工作原理。他们压缩磁盘文件,而不是可执行代码。要使压缩文件再次可执行,需要对其进行解压缩,并将解压缩的数据存储在内存中。对于普通的非压缩 EXE 文件,操作系统将仅加载文件中当前需要的部分。其余的可以保留在磁盘上。由于您的整个未压缩应用程序都在内存中,这就是您的内存使用率看起来更高的原因。

此外,磁盘文件可以由多个用户共享,而包含未压缩可执行文件的内存不共享。每个运行您的程序的用户都有一份未压缩程序的单独副本。

通过压缩程序节省的 26 MB 磁盘空间在共享远程桌面服务器上几乎没有。不要费心压缩文件。如果您想在分发期间压缩文件以节省带宽,请将您的程序打包到安装程序中,在安装时解压缩文件一次,而不是每次运行时都需要解压缩文件的 EXE 压缩器。

【讨论】:

  • +1 关于解压缩到内存中的技术描述,以及不要压缩程序的建议。致 Enzo:您最好不要使用 UPX 而不是 Delphi 可执行文件。由于防病毒软件,可能会出现很多误报警告 - 所以UPX is not worth it for Delphi Desktop applications
  • 谢谢你,Rob Kennedy,你做得很彻底!
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多