托管和非托管堆

时间:2011-07-08 08:11:10

标签: .net heap unmanaged

什么是非托管堆?

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

3 个答案:

答案 0 :(得分:10)

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

当然,您可能会或可能不会听到这个词的上下文 - 如果您可以向我们提供一些示例,我们可以为您提供更多帮助。

答案 1 :(得分:5)

根据John Skeet - managed堆是.net将为您管理的堆,所有标准对象都是在其上创建的,您通常不需要太多关注,因为它是受管理的

unmanaged表示您个人正在分配内存,因此您个人有责任解除分配,自行管理,并跟踪正在使用的内容。

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

答案 2 :(得分:0)

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

在.net框架中,我们有Garbage收集器,它由Common语言例程初始化。在其初始化期间,Garbage收集器分配一段内存来存储和管理由托管代码实例化的对象。这个内存称为托管堆,而不是到操作系统中的本机堆。

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