内存中的DLL大小和硬盘上的大小
DLL size in memory & size on the hard disk
内存中的DLL大小和硬盘上的大小之间有关系吗?
这是因为我使用的是任务管理器扩展(MS),我可以转到列表中的一个EXE,右键单击->模块,然后我可以看到这个EXE正在使用的所有DLL。它有一个Length列,但它是以字节为单位的吗?DLL的值(长度)似乎与硬盘上的(DLL)大小不同。为什么?
有一种关系,但它并不完全直接或直接。
当你的DLL第一次被使用时,它会被映射到内存。这不会将其加载到内存中,只是在进程中分配一些地址空间,以便在需要时/可以在其中加载。然后,DLL的各个页面通过请求分页加载到内存中——即,当您引用已分配的一些地址空间时,映射到该地址的代码(或数据)将被加载,如果它还没有在内存中。
现在,地址映射确实占用了一点空间(每映射一兆字节的地址空间就有一个4K页面)。当然,当您将一些数据加载到内存中时,也会占用内存。
然而,请注意,大多数页面也可以/将在进程之间共享,因此,如果您的DLL同时被5个不同的进程使用,它将被映射5次(即,一次映射到使用它的每个进程),但内存中仍然只有一个物理副本(至少在正常情况下)。
在这两者之间,甚至很难准确地确定特定DLL的内存消耗是什么意思。
在确定内存中dll的大小时,有两个部分起作用:
- 正如其他人所指出的,dll的内存被映射,这导致其大小被页面对齐(这是过去首选加载地址必须被页面对齐的原因之一)。通常,32位系统的页面对齐是4Kb,64位系统的是8Kb(要在windows上更深入地了解这一点,请参阅此)
- Dll包含一个用于未初始化数据的段,在磁盘上,该段被压缩,通常压缩到基本+大小,当加载和初始化Dll时,
.bss
段的空间被分配,从而增加其大小。一般来说,这是一个小的,并且会被页面对齐所吸收,但如果dll包含巨大的静态缓冲区,这可能会膨胀其虚拟化大小
内存占用通常会大于磁盘大小,因为当它被映射到内存中时,它是页面对齐的。标准的页面大小是4KB和8KB,所以如果你的dll是1KB的代码,它仍然会在内存中使用4KB。
不要把.dll或.exe看作是复制到内存中执行的东西。
可以将其视为加载程序的一组指令。当然它包含程序和静态数据文本。更重要的是,它包含了允许重新定位文本的所有信息,并连接了所有未满足的引用,以及导出其他模块可能需要的引用。
然后,如果有符号和行号信息可供调试,那将是更多的文本。
所以一般来说,你会期望它比内存图像大。
这完全取决于您所称的"内存",以及TaskManager扩展到底显示了什么。
每个可执行模块(Exe/Dll)都被映射到地址空间中。此映射的大小等于其大小。而且,我想,这就是你的"扩展"向你展示的。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 抵消内存中加载的 DLL 与硬盘上的 DLL 之间的不匹配
- 内存中的DLL大小和硬盘上的大小
- 从内存到硬盘驱动器(C/ c++)读取和读取整个数组