内存中的DLL大小与硬盘上的大小之间是否存在关系?
这是因为我正在使用任务管理器扩展程序(MS),我可以转到列表中的EXE并右键单击 - >模块,然后我可以看到这个EXE正在使用的所有DLL。它有一个Length列,但是以字节为单位?并且DLL的值(Length)似乎与硬盘上的(DLL)大小不同。为什么呢?
答案 0 :(得分:5)
有一种关系,但并不是完全直接或直接的。
首次使用DLL时,它会映射到内存。这不会将其加载到内存中,只需在您的进程中分配一些地址空间,可以/可以在需要时加载它。然后,DLL的各个页面通过请求分页加载到内存中 - 即,当您引用已分配的某些地址空间时,将加载映射到该/那些地址的代码(或数据)如果它还没有在记忆中。
现在,地址映射占用了一点空间(每兆字节地址空间被映射一个4K页面)。当然,当你将一些数据加载到内存中时,也会耗尽内存。
但是,请注意,大多数页面也可以/将在进程之间共享,因此如果您的DLL一次被5个不同的进程使用,它将被映射5次(即,每次使用它的进程一次)但是内存中仍然只有一个物理副本(至少通常是这样)。
在这些之间,甚至可能有点难以确切地确定特定DLL的内存消耗的含义。
答案 1 :(得分:2)
在确定内存中dll的大小时,有两个部分可以发挥作用:
.bss
段的空间被分配,增加其大小。通常这个很小并且会被页面对齐所禁止,但如果一个dll包含巨大的静态缓冲区,这可能会使其虚拟化大小膨胀。答案 2 :(得分:1)
不要将.dll或.exe视为被复制到内存中以执行的内容。
将其视为加载程序的一组指令。 当然它包含程序和静态数据文本。 更重要的是,它包含允许重新定位文本的所有信息,并将所有未满足的引用连接起来,并导出其他模块可能需要的引用。
然后,如果有用于调试的符号和行号信息,则还有更多文本。
所以一般来说,你会期望它比内存图像更大。
答案 3 :(得分:0)
这完全取决于你所谓的“内存”,以及你的TaskManager扩展程序究竟显示的内容。
每个可执行模块(Exe / Dll)映射到地址空间。此映射的大小等于其大小。而且,我想,这就是你的“扩展”给你看的。
答案 4 :(得分:0)
内存占用量通常大于磁盘大小,因为当它映射到内存时,它是页面对齐的。标准页面大小为4KB和8KB,因此如果你的dll是1KB的代码,它仍将在内存中使用4KB。