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

为什么java中的数组值存储在堆中? 编程语言如C、C++将不会在 HeP中存储数组值,而是将值保持在堆栈。但是在Java中为什么有必要将数组值保存在堆中?,java,arrays,memory-management,Java,Arrays,Memory Management,在Java中,数组(就像所有其他对象一样)是通过引用传递的:当您将数组传递给方法时,它将获得指向内存中相同位置的引用,而不进行复制。这意味着数组需要在创建它的方法之后保持“活动”,因此不能存储在该方法的堆栈帧中。它需要由垃圾收集器管理,就像所有其他对象一样 有一些研究正在使用“escape analysis”优化JVM内存分配:如果可以保证对象(如数组)永远不会离开当前作用域,那么实际上可以在堆栈上分配它,这会更有效。简单的回答是,Java中的数组是一种引用类型,和引用类型位于堆上。值得注意的是

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


有一些研究正在使用“escape analysis”优化JVM内存分配:如果可以保证对象(如数组)永远不会离开当前作用域,那么实际上可以在堆栈上分配它,这会更有效。

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

int[]a={10,20,30};
此数组存储在
堆栈中,但以下数组存储在
堆中:

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

总是像对待java对象一样对待数组,所以当我们有一个像上面那样的声明时,不要被数组不存储在ram上这一事实所迷惑。

为什么这对您很重要?JVM应该处理任何内存分配和释放问题。具体地说,我认为这取决于你有什么类型的数组,主要的还是对象。反正我也不在乎。。但我只是想知道为什么内存分配被保存在堆中。这背后有什么特别的原因吗?没错……你的术语不太准确。引用类型不存在于堆上;这些引用类型引用的对象位于堆上。因为数组在Java中是一个对象,所以它存在于堆上。我对“引用类型”和“值类型”的使用与.Net的使用是一致的,正如您所说,这是相当不精确的。我认为这是不正确的。您的第一个示例只是newint[]{10,20,30}的简写,我的理解是数组将存储在堆上。