使用堆栈空间的Java数组

使用堆栈空间的Java数组,java,arrays,Java,Arrays,这是声明Java数组的常用方法: int[] arr = new int[100]; 但是这个数组正在使用堆空间。有没有一种方法可以使用C++之类的堆栈空间声明数组? 数组是动态分配的,因此它们会继续堆。 我的意思是,当你这样做时会发生什么: int[] arr = new int[4]; arr = new int[5]; 如果第一次分配是在堆栈上完成的,我们将如何对其进行垃圾收集?参考arr存储在堆栈上,但实际的数据数组必须在堆上。总之,不是 堆栈上存储的唯一变量是基本体和对象引用。在您

这是声明Java数组的常用方法:

int[] arr = new int[100];

但是这个数组正在使用堆空间。有没有一种方法可以使用C++之类的堆栈空间声明数组?

数组是动态分配的,因此它们会继续堆。

我的意思是,当你这样做时会发生什么:

int[] arr = new int[4];
arr = new int[5];
如果第一次分配是在堆栈上完成的,我们将如何对其进行垃圾收集?参考
arr
存储在堆栈上,但实际的数据数组必须在堆上。

总之,不是

堆栈上存储的唯一变量是基本体和对象引用。在您的示例中,
arr
引用存储在堆栈上,但它引用堆上的数据


如果你问这个问题来自C++,因为你想确定你的内存被清理了,请阅读。简而言之,Java会自动清理堆中的内存以及堆栈上的内存。

数组是对象
,而不管它持有的是基元类型还是对象类型,因此与任何其他对象一样,它在堆上分配的空间也

但是从Java6U23版本开始,
转义分析
就出现了,它在Java7中被默认激活

转义分析是关于对象的范围的
当一个对象在方法范围而不是类范围内定义时,JVM知道这个对象无法转义这个有限的方法范围,并对其应用各种优化。。像不断折叠等

Then it can also allocate the object which is defined in the method scope,
on the Thread's Stack, which is accessing the method.

它还没有作为一种语言特性得到支持,因为通过引用传递堆栈数据是不安全的,所以需要使用它


但是,作为一种优化(),JVM可能已经对包含小型固定大小数组的局部变量这样做了,如果它可以证明它没有脱离本地/被调用方范围。也就是说,这只是一个运行时优化,而不是一些规范保证,因此依赖它是很困难的。

@JigarJoshi:moar stackoverflow.Array是一个容器对象。所有对象都放在堆上。@JigarJoshi我想访问堆栈中的空间会更快吗?在创建/收集堆外对象时,可能会损失一两微秒,但是,除非您多次这样做,担心这样的优化是徒劳的。如果JIT认为有机会通过将数组保留在内存中的特定位置来进行优化,它可能会这样做,但这是它的工作,不是你的。