为什么java中的数组值存储在堆中?

时间:2009-12-15 13:45:41

标签: java arrays memory-management

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

3 个答案:

答案 0 :(得分:17)

在Java中,数组(就像所有其他对象一样)通过引用传递:当您将数组传递给方法时,它将获得指向内存中相同位置的引用,不会进行任何复制。这意味着数组需要在创建它的方法之后保持“活动”,因此不能存储在方法的堆栈帧中。它需要由垃圾收集器管理,就像所有其他对象一样。

有一些研究正在使用“转义分析”来优化JVM内存分配:如果可以保证对象(例如数组)永远不会离开当前作用域,则实际上可以将它分配到堆栈中,这更有效率。

答案 1 :(得分:6)

简短的回答是Java中的数组是引用类型,引用类型存在于堆上。值得注意的是,在C#中,可以切换到不安全模式并使用stackalloc初始化数组,这将在堆栈上创建数组。因此,VM很可能允许您在堆栈上创建一个数组,而这只是一个实现细节,这意味着数组都存在于堆上。

答案 2 :(得分: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对象,所以当我们有一个像上面那样的声明时,不要被数组存储在ram上的事实所迷惑。