8

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

int[] arr = new int[100];

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

4

4 回答 4

19

Arrays are objects不管它是原始类型还是对象类型,所以像任何其他对象一样allocated space on the heap.

But then from Java 6u23版本,Escape Analysis应运而生,由default activated in Java 7.

Escape Analysis is about the scope of the object, when an object is defined inside a method scope rather than a class scope, 那么 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.
于 2012-06-08T18:17:19.373 回答
11

一句话,没有。

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

如果你问这个来自 C++ 的问题是因为你想确保你的内存被清理干净,请阅读垃圾收集。简而言之,Java 会自动清理堆中的内存以及栈中的内存。

于 2012-06-08T18:05:00.033 回答
3

数组是动态分配的,所以它们在堆上。

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

int[] arr = new int[4];
arr = new int[5];

如果第一次分配是在堆栈上完成的,我们将如何垃圾收集它?引用arr存储在堆栈上,但实际的数据数组必须在堆上。

于 2012-06-08T18:02:38.580 回答
1

它还没有作为语言特性得到支持,因为这需要值类型,因为通过引用传递堆栈数据是不安全的。

但是作为一种优化(逃逸分析),JVM 可能已经对包含固定大小的小型数组的局部变量执行此操作,但前提是它可以证明它没有逃逸本地/被调用者范围。也就是说,这只是一个运行时优化,而不是一些规范保证,因此很难依赖它。

于 2016-10-12T10:47:05.427 回答