为什么Java对象在堆中分配?

时间:2018-04-29 08:58:31

标签: java

引用维基百科'当您需要删除具有最高(或最低)优先级的对象时,堆是一种有用的数据结构。

我熟悉堆是什么以及我可以用它们解决的问题,但我想知道为什么这个数据结构是用于在Java中分配对象的数据结构?是什么决定了对象的优先级?

2 个答案:

答案 0 :(得分:1)

引用的文字指的是一种称为堆的data structure

单词堆也用于dynamic memory management的形式。

在这种情况下,一个IT英语单词具有两种不同且独立的含义。 (这在普通英语中是一种相当普遍的现象......)

  

我想知道为什么这个数据结构是用于在Java中分配对象的那个?

简单地说,它不是。不使用堆数据结构组织动态内存堆(例如Java堆)。

事实上,Java堆根本就不是一个数据结构。相反,它是一个分配对象的内存区域。通过跟踪可到达的对象,然后删除剩余的对象并合并剩余的空间来回收空间。

相比之下,无法跟踪和合并C或C ++堆(因为没有足够的可靠类型信息来允许明确地识别指针)。因此,C / C ++堆将包含用于组织可用空间的数据结构。但是,这不是引用文本意义上的堆数据结构。通常它是一个"节点列表的数组"大小相同。

答案 1 :(得分:0)

我将通过引用C ++来解释这一点。 在初始化变量时会得到在堆栈上创建的局部变量,在离开块时会被销毁。基本上这意味着每个局部变量都存在于块的堆栈框架内。因此,死了块,死了变量。

如果您事先并不知道对象的大小,则必须在堆上分配内存。一个例子是动态可调整大小的数组。在C ++中,这是通过“new”运算符(或malloc,calloc,realloc等)完成的。在Java中,您也使用“new”运算符执行此操作。这意味着您负责创建和释放内存。

当您离开块时,堆上的对象不会被破坏。除非您在主函数中定义它,然后程序退出。 在C ++中,您可以调用delete或free()来释放堆对象的已创建内存。另一方面,在Java中,垃圾收集器会为您执行此操作。它通过基本保持对实例的引用计数来做到这一点(当然它比它复杂一点)。