内存中的DLL大小&硬盘上的大小

时间:2012-03-18 20:25:01

标签: c++ performance optimization dll

内存中的DLL大小与硬盘上的大小之间是否存在关系?

这是因为我正在使用任务管理器扩展程序(MS),我可以转到列表中的EXE并右键单击 - >模块,然后我可以看到这个EXE正在使用的所有DLL。它有一个Length列,但是以字节为单位?并且DLL的值(Length)似乎与硬盘上的(DLL)大小不同。为什么呢?

5 个答案:

答案 0 :(得分:5)

有一种关系,但并不是完全直接或直接的。

首次使用DLL时,它会映射到内存。这不会将其加载到内存中,只需在您的进程中分配一些地址空间,可以/可以在需要时加载它。然后,DLL的各个页面通过请求分页加载到内存中 - 即,当您引用已分配的某些地址空间时,将加载映射到该/那些地址的代码(或数据)如果它还没有在记忆中。

现在,地址映射占用了一点空间(每兆字节地址空间被映射一个4K页面)。当然,当你将一些数据加载到内存中时,也会耗尽内存。

但是,请注意,大多数页面也可以/将在进程之间共享,因此如果您的DLL一次被5个不同的进程使用,它将被映射5次(即,每次使用它的进程一次)但是内存中仍然只有一个物理副本(至少通常是这样)。

在这些之间,甚至可能有点难以确切地确定特定DLL的内存消耗的含义。

答案 1 :(得分:2)

在确定内存中dll的大小时,有两个部分可以发挥作用:

  1. 正如其他人所指出的那样,dll得到了内存映射,这导致了页面对齐的大小(因为当天的首选加载地址必须是页面对齐的原因)。通常,对于32位系统,页面对齐为4Kb,对于64位系统,页面对齐为8Kb(在窗口上更深入地了解此情况,请参阅this)。
  2. Dll包含未初始化数据的段,在磁盘上该段被压缩,通常为基本+大小,当加载并初始化dll时,.bss段的空间被分配,增加其大小。通常这个很小并且会被页面对齐所禁止,但如果一个dll包含巨大的静态缓冲区,这可能会使其虚拟化大小膨胀。

答案 2 :(得分:1)

不要将.dll或.exe视为被复制到内存中以执行的内容。

将其视为加载程序的一组指令。 当然它包含程序和静态数据文本。 更重要的是,它包含允许重新定位文本的所有信息,并将所有未满足的引用连接起来,并导出其他模块可能需要的引用。

然后,如果有用于调试的符号和行号信息,则还有更多文本。

所以一般来说,你会期望它比内存图像更大。

答案 3 :(得分:0)

这完全取决于你所谓的“内存”,以及你的TaskManager扩展程序究竟显示的内容。

每个可执行模块(Exe / Dll)映射到地址空间。此映射的大小等于其大小。而且,我想,这就是你的“扩展”给你看的。

答案 4 :(得分:0)

内存占用量通常大于磁盘大小,因为当它映射到内存时,它是页面对齐的。标准页面大小为4KB和8KB,因此如果你的dll是1KB的代码,它仍将在内存中使用4KB。