这是声明Java数组的常规方式:
int[] arr = new int[100];
但是这个数组使用了堆空间。是否有一种方法可以像 C++ 一样使用栈空间声明一个数组?
这是声明Java数组的常规方式:
int[] arr = new int[100];
但是这个数组使用了堆空间。是否有一种方法可以像 C++ 一样使用栈空间声明一个数组?
不管它是包含原始类型还是对象类型,数组都是对象
,因此像其他任何对象一样,它在堆上分配了空间。
但是从Java 6u23版本开始
,逃逸分析
应运而生,并且在Java 7中默认激活
。
逃逸分析关注对象的作用域
,当一个对象在方法作用域内定义而不是类作用域内时
,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并提出这个问题,请阅读有关垃圾收集的文章。简单来说,Java会自动处理清理堆内存以及堆栈上的内存。
数组是动态分配的,因此它们位于堆上。
我的意思是,当您执行以下操作时会发生什么:
int[] arr = new int[4];
arr = new int[5];
arr
存储在堆栈上,但实际的数据数组必须存储在堆上。