代码之家  ›  专栏  ›  技术社区  ›  balaweblog

当内存分配给程序时?

  •  1
  • balaweblog  · 技术社区  · 16 年前

    我需要知道什么时候为一个特定的程序分配内存。如何查看内存的分配位置。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Adam Davis    16 年前

    您需要更具体地使用OS,或者如果它是解释或运行时编译的语言(即PHP、Java、.NET等)。

    但是,一般来说:

    • 静态变量和全局变量是在程序装入内存时分配的。
    • 当运行实例化局部变量的函数或块时,会在堆栈上分配局部变量(有时是堆,取决于编译器)。
    • 在程序内存的其他点上,对象创建时分配内存,对象销毁时释放内存(显式地或通过垃圾收集)。
    • 程序也可以通过malloc或类似的内存分配调用显式地分配内存给操作系统。

    应该注意的是,即使内存已经与操作系统一起分配,它也可能还没有真正被分配——操作系统等待直到内存被使用,然后才为其获取一个页面。内存分析器将帮助您了解给定进程在何处以及何时发生这种情况。

    在哪里分配内存是一个更大的问题。有几个观点需要考虑:

    • 程序的视角(通常是一个平坦的虚拟内存区,程序可以在其中运行,而不会与其他程序发生冲突-在32位计算机上约4GB)
    • 操作系统的观点是,根据需要将内存页换成一个输出,这样程序就可以假装有一个漂亮的、平坦的、未分段的内存区来播放。
    • CPU的观点,其中内存是连续的
    • 内存控制器的视角,其中可能有两个512条和一个1GB条,中间有一个空插槽

    你对哪种观点感兴趣?您是在编写在感兴趣的程序中运行、与它共享内存、在同一操作系统上运行、在同一CPU上运行,还是将逻辑分析仪连接到内存总线上的代码?

    -亚当

        2
  •  2
  •   Ben Hoffstein    16 年前

    我在这里刺一刺,然后推荐 dotTrace 我用过的最好的探查器。它会告诉你内存使用情况以及更多信息。

        3
  •  1
  •   Ash    16 年前

    安装 Process Explorer ,在列表中找到应用程序/进程,右键单击,属性,性能选项卡。

        4
  •  1
  •   Robert Gould    16 年前

    正如一个警告性的故事,即使您自己没有分配太多,您使用的库也可能会进行大量的分配,因此您需要一些与内核或框架相关的东西。正如BenHoffstein所说,dottrace可能是.NET应用程序的一个很好的解决方案(这是我在查看问题的标签后才意识到的)。