这是声明 Java 数组的常用方法:
int[] arr = new int[100];
但是这个数组正在使用堆空间。有没有一种方法可以使用 c++ 之类的堆栈空间来声明数组?
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.
一句话,没有。
存储在堆栈中的唯一变量是原语和对象引用。在您的示例中,arr
引用存储在堆栈中,但它引用了堆上的数据。
如果你问这个来自 C++ 的问题是因为你想确保你的内存被清理干净,请阅读垃圾收集。简而言之,Java 会自动清理堆中的内存以及栈中的内存。
数组是动态分配的,所以它们在堆上。
我的意思是,当你这样做时会发生什么:
int[] arr = new int[4];
arr = new int[5];
如果第一次分配是在堆栈上完成的,我们将如何垃圾收集它?引用arr
存储在堆栈上,但实际的数据数组必须在堆上。