【发布时间】:2021-07-06 06:40:21
【问题描述】:
在上图中,我们可以看到进程内存“Value”是 292 Mb,但“Managed heap”只有 14 Mb。我的理解是否正确:“值”包含托管和非托管内存,而“托管堆”仅包含托管内存?
【问题讨论】:
标签: .net visual-studio
在上图中,我们可以看到进程内存“Value”是 292 Mb,但“Managed heap”只有 14 Mb。我的理解是否正确:“值”包含托管和非托管内存,而“托管堆”仅包含托管内存?
【问题讨论】:
标签: .net visual-studio
是的,“值”是进程消耗的整个内存。托管堆包含所有托管内存。托管内存是进程总内存的子集。在幕后,运行时为它所做的各种事情分配内存,例如 JIT、线程堆栈。如果您的程序分配了非托管内存(无论是在您的代码中,还是在库代码中),它也不会出现在托管堆中。
【讨论】:
正如颜色编码、圆圈和图例所示,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
【讨论】: