【问题标题】:When memory is allocated for a program?什么时候为程序分配内存?
【发布时间】:2008-09-29 03:58:53
【问题描述】:

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

【问题讨论】:

  • 你能提供更多细节吗?
  • 你的意思是你需要一个内存分析器吗?
  • 哈哈...电脑的背面。让我上了那个:-)

标签: .net asp.net


【解决方案1】:

您需要更具体地了解操作系统,如果是解释型或运行时编译型(例如 PHP、JAVA、.NET 等),可能还需要更具体的语言。

但是,一般来说:

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

应该注意的是,即使内存已经分配给操作系统,它可能还没有真正被分配 - 操作系统会等到内存被使用后才会为它获取页面。内存分析器将帮助您了解给定进程在何时何地发生这种情况。

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

  • 程序的观点(通常是一个平坦的虚拟内存区域,程序可以在其中运行而不会与其他程序发生冲突 - 在 32 位机器上大约 4GB)
  • 从操作系统的角度来看,内存页面会根据需要换入和换出,因此程序可以假装它们有一个漂亮、平坦、未分段的内存区域可供播放
  • 内存连续的CPU视角
  • 内存控制器的观点,它可能有两个 512 记忆棒和一个 1GB 记忆棒,中间有一个空插槽

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

-亚当

【讨论】:

  • 感谢您的信息。我一直想知道的是实际开销是多少,有未分配的成员与根本没有这些成员在课堂上。在分配局部变量之前是否有任何开销?我想一定有。尤其是指 Java,C#。
【解决方案2】:

我会在这里尝试并推荐dotTrace,这是我用过的最好的分析器。它会告诉你内存使用情况等等。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这只告诉你程序分配了多少,而不是什么时候。 Performance Graph 选项卡可能要好一些,但它只显示整体使用情况,并且通常只是增长。不足以提供太多帮助。
    • 这就是优质秒针手表派上用场的地方:-)
    • @Chris,“性能”选项卡是动态更新的,因此您可以查看何时分配内存。我知道那里有更详细的分析器工具,但是 ProcExplorer 是一个很好的简单工具。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2013-11-24
      • 2013-03-17
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多