什么时候为程序分配了内存?
时间:2020-03-06 14:51:35 来源:igfitidea点击:
我需要知道何时为特定程序分配内存。我如何查看内存的分配位置。
解决方案
安装Process Explorer,在列表中找到应用程序/进程,右键单击"属性","性能"选项卡。
我将在这里进行介绍并推荐dotTrace,这是我使用过的最好的探查器。它会告诉我们内存使用情况等等。
我们需要对操作系统和语言(如果是经过解释或者在运行时编译的语言)(例如PHP,JAVA,.NET等)进行更具体的说明。
但是,通常:
- 当程序加载到内存中时,将分配静态和全局变量。
- 运行实例化局部变量的函数或者块时,局部变量会分配在堆栈上(有时是堆,具体取决于编译器)。
- 在其他时候,程序存储器在创建对象时分配,并在销毁对象时(明确地或者通过垃圾回收)释放。
- 该程序还可以通过对OS的malloc或者类似的内存分配调用显式分配内存。
应该注意的是,即使已经为OS分配了内存,也可能尚未实际分配内存,OS会等到使用内存后再为其获取页面。内存探查器将了解给定进程的发生时间和地点。
分配内存的位置是一个更大的问题。需要考虑以下几种观点:
- 程序的观点(通常是一个平坦的虚拟内存区域,程序可以在其中运行而不与其他程序冲突-32位计算机上约为4GB)
- 操作系统的观点,根据需要将内存页面换出,因此程序可以假装它们有一个不错的,平坦的,未分段的内存区域可以播放
- CPU内存连续的观点
- 从内存控制器的角度来看,它可能有两个512个存储棒和一个1GB的存储棒,并且中间有一个空插槽
我们对哪种观点感到好奇?我们是在编写在目标程序内运行,与之共享内存,在同一OS上运行,在同一CPU上运行,还是将逻辑分析仪连接到内存总线的代码?
-亚当
就像一个警告性的故事一样,即使我们自己不分配太多资源,我们使用的库可能也会进行大量分配,因此我们需要一些与内核或者框架相关的东西。正如本·霍夫斯坦(Ben Hoffstein)所说,dotTrace可能是.Net应用程序的一个很好的解决方案(这是我在查看问题的标签之后才意识到的)