2009-12-15 319 views
4

像C语言编程,C++不会数组值存储在而是保持在STACK的值。但在Java中,为什么有必要将数组值保存在堆中?为什么java中的数组值存储在堆中?

+1

为什么它怎么了你? JVM应该处理任何内存分配和释放问题。具体来说,我认为这取决于你有什么类型的数组,主要是vs对象。 – Jay 2009-12-15 14:23:26

+1

@Jay。无论如何,它并不困扰我。但是我想知道为什么内存分配保存在堆中。这背后有什么特别的原因吗?多数民众赞成在... – i2ijeya 2009-12-16 14:46:02

回答

16

在Java中,数组(就像所有其他对象)都通过引用传来传去:当你传递一个阵列的方法,它会得到指向内存中的相同位置的引用,没有复制,正在取得进展。这意味着数组需要在创建它的方法后保持“活动”状态,因此不能存储在方法的堆栈框架中。它需要由垃圾收集器管理,就像所有其他对象一样。

有一些研究正在使用“逃逸分析”来优化JVM内存分配:如果一个对象(如数组)可以保证永远不离开当前范围,事实上可以将其分配给堆栈,这是更高效。

6

短的回答是,在Java中的阵列是一个引用类型,和引用类型住在堆上。值得一提的是,在C#,一个可以切换到不安全模式和初始化用stackalloc阵列这将在栈上创建该阵列。因此,它是完全有可能的是,虚拟机将让你做出在栈上的数组,它只是一个实现细节,这意味着阵列都生活在堆上。

+0

你的术语不是很精确。引用类型不会生活在堆上;这些引用类型引用的对象*存在于堆中。由于数组是Java中的一个对象,因此它存在于堆中。 – Jesper 2009-12-15 14:53:51

+0

非常正确。我使用“引用类型”和“值类型”符合.Net的用法,正如你所说的那样,它不太精确。 – AlecZorab 2009-12-16 22:44:43

0
int[]a={10,20,30}; 

stack这个数组存储,但下面的数组存储在heap

`int[]num=new int num[2];`//here we build the object of array , object always located in heap 

总是像对待Java对象数组,所以不要的事实,数组不存储在混淆当我们有一个像上面这样的声明时,公羊就会出现。

+0

我不认为这是正确的。你的第一个例子是新的int [] {10,20,30}的简写,我的理解是数组将被存储在堆上。 – darrenmc 2014-09-08 14:32:32

相关问题