像C,C ++这样的编程语言不会将数组值存储在堆中,而是将值保存在堆栈中。但是在Java中为什么有必要在堆中保留数组值?
答案 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上的事实所迷惑。