【问题标题】:What is difference between "value" and "managed heap" in "Process memory"?“进程内存”中的“值”和“托管堆”有什么区别?
【发布时间】:2021-07-06 06:40:21
【问题描述】:

我有这样的记忆状态:

在上图中,我们可以看到进程内存“Value”是 292 Mb,但“Managed heap”只有 14 Mb。我的理解是否正确:“值”包含托管和非托管内存,而“托管堆”仅包含托管内存?

【问题讨论】:

    标签: .net visual-studio


    【解决方案1】:

    是的,“值”是进程消耗的整个内存。托管堆包含所有托管内存。托管内存是进程总内存的子集。在幕后,运行时为它所做的各种事情分配内存,例如 JIT、线程堆栈。如果您的程序分配了非托管内存(无论是在您的代码中,还是在库代码中),它也不会出现在托管堆中。

    【讨论】:

      【解决方案2】:

      正如颜色编码、圆圈和图例所示,Value 指的是 Private Bytes。它是进程虚拟内存的子集。它包括托管和非托管内存,它们是私有的,不与其他进程共享。私有内存包括例如堆和栈:

      Private Bytes 是此进程已分配且无法与其他进程共享的内存的当前大小(以字节为单位)。

      What is private bytes, virtual bytes, working set?

      托管堆是指托管应用程序的堆,即 .NET 应用程序。它是私有字节的子集。

      垃圾收集器被CLR初始化后,会分配一段内存来存储和管理对象。此内存称为托管堆,而不是操作系统中的本机堆。

      每个托管进程都有一个托管堆。进程中的所有线程都为同一个堆上的对象分配内存。

      为了保留内存,垃圾收集器调用 Windows VirtualAlloc 函数并一次为托管应用程序保留一段内存。垃圾收集器还会根据需要保留段,并通过调用 Windows VirtualFree 函数将段释放回操作系统(在清除它们的任何对象之后)。

      https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#the-managed-heap

      【讨论】:

        猜你喜欢
        • 2021-11-10
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2016-10-12
        • 1970-01-01
        • 2020-04-04
        相关资源
        最近更新 更多