2011-07-08 213 views
5

什么是非托管堆?托管和非托管堆

我认为CLR管理的任何基于对象的内存都是托管堆,那么我们为什么要讨论一个非托管堆呢?

回答

10

想象一下,使用P/Invoke调用Win32函数,并使用malloc分配一些内存。垃圾收集器没有该内存的可见性 - 它是非托管的

这可能是也可能不是您听过这个术语的上下文,当然 - 如果您可以指出我们的一些例子,我们可以帮助您更多。

+1

好,所以在CLR的上下文中,没有非托管堆。所以它只是非托管代码使用的内存,必须专门用于完整的GC ......正确? –

+0

@ user164184,这听起来是正确的,是的。 –

+2

@ user164184:我不会说那里*是*没有非托管堆 - 更多的是我们不需要担心它。 CLR本身无疑会使用非托管数据结构。 –

6

根据John Skeet-managed堆是.net将为您管理的那个,所有标准对象都是创建的,您通常不需要打扰太多,因为它是托管的。

unmanaged意味着你亲自分配内存,因此你个人负责释放它,自己管理它,并跟踪正在使用的内容。

所以是的,对象内存(在正常对象创建和销毁的意义上,从对象派生的东西)被管理。这是你需要担心的其他东西 - 分配给它们的非对象和内存。

0

为了理解.net中的非托管堆,我们需要了解Managed Heap是什么。

在.net框架中,我们有垃圾收集器,它由通用语言程序初始化。在其初始化过程中,垃圾收集器分配一段内存来存储和管理通过托管代码实例化的对象。该内存称为托管堆,反对操作系统中的本地堆。

非托管堆是非托管代码/本机代码在运行时用于分配内存的一个堆。此堆不受垃圾收集器控制,它需要由开发人员处理以释放分配的内存。 Difference between "managed" and "unmanaged"