堆实际上是堆吗?

时间:2011-01-08 19:42:40

标签: java .net memory-management

  

可能重复:
  Why are two different concepts both called “heap”?
  What's the relationship between “a” heap and “the” heap?

在.NET(据我所知,Java)中,动态分配对象的区域称为托管堆。但是,描述托管堆如何工作的大多数documentation将其描述为线性数据结构,例如链表或堆栈。

那么,托管堆实际上是heap,还是用其他一些数据结构实现的呢?如果它实际上没有使用堆数据结构,那么术语的重大失败似乎会超出这个词的含义。

如果它实际上是一个堆数据结构,那么满足堆属性的值是什么:分配的内存区域的大小?

4 个答案:

答案 0 :(得分:14)

不,堆根本不是heap-ordered binomial tree。我不清楚(对我而言)术语冲突的错误,但堆的使用都可以追溯到几十年前(1970年中期,它出现)。有些历史记录在this article中进行了讨论。

答案 1 :(得分:1)

从这个意义上讲,“堆”意味着:用于存储重要资源的特殊内存区域。在这种情况下,它与“堆数据结构”无关。

答案 2 :(得分:1)

我当然没有历史知识可以用任何权限对此进行评论,但我认为用于描述.NET和Java中较长寿命对象的内存分配机制的术语“堆”更倾向于一个令人回味的,描述性的词,这个大的非结构化(从开发者的角度来看)大量的记忆,其中的东西存在。相反,“堆栈”唤起了更加结构化的数据区域的图像(同样,从开发人员的角度来看):堆栈中的“在哪里”感觉比它们在堆上的“何处”更具相关性。 / p>

这显然与实际heap data structure非常不同,{{3}}使用“heap”一词来引用所谓的堆属性(来自维基百科):

  

如果B是A的子节点,则键(A)≥键(B)。

所以是的,他们实际上是无关的。一个只是一个描述性术语,而另一个则有更正式的定义。

答案 3 :(得分:0)

我不确定我的答案,但据我所知,在C#或Java等语言中,内存管理我的垃圾收集器,内存区域不是线性的。 GC正在释放可以释放的内存,当内存不足时,它会压缩内存进行某种碎片整理。它移动程序使用的内存块在“最后”创造一些空间。 你为什么需要这个答案?你想做一些低级别的内存管理吗?