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

DLL size in memory & size on the hard disk

本文关键字:硬盘 内存 DLL      更新时间:2023-10-16

内存中的DLL大小和硬盘上的大小之间有关系吗?

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

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

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

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

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

在这两者之间,甚至很难准确地确定特定DLL的内存消耗是什么意思。

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

  1. 正如其他人所指出的,dll的内存被映射,这导致其大小被页面对齐(这是过去首选加载地址必须被页面对齐的原因之一)。通常,32位系统的页面对齐是4Kb,64位系统的是8Kb(要在windows上更深入地了解这一点,请参阅此)
  2. Dll包含一个用于未初始化数据的段,在磁盘上,该段被压缩,通常压缩到基本+大小,当加载和初始化Dll时,.bss段的空间被分配,从而增加其大小。一般来说,这是一个小的,并且会被页面对齐所吸收,但如果dll包含巨大的静态缓冲区,这可能会膨胀其虚拟化大小

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

不要把.dll或.exe看作是复制到内存中执行的东西。

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

然后,如果有符号和行号信息可供调试,那将是更多的文本。

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

这完全取决于您所称的"内存",以及TaskManager扩展到底显示了什么。

每个可执行模块(Exe/Dll)都被映射到地址空间中。此映射的大小等于其大小。而且,我想,这就是你的"扩展"向你展示的。