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

i2i*_*eya 5 java arrays memory-management

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

Thi*_*ilo 17

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

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


Ale*_*rab 6

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