什么时候为程序分配了内存?

时间: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应用程序的一个很好的解决方案(这是我在查看问题的标签之后才意识到的)