Java可以在堆栈上分配列表吗?

2022-09-04 08:01:37

每次当我在java中启动列表时,我都会这样做

List<Integer> list = new LinkedList<>();

我假设这将在堆上分配列表。想知道我是否可以在堆栈上分配列表?


答案 1

所有对象(包括其各自的属性)都存储在堆中。

所有局部变量及其参数都存储在堆栈上,因为它们包含基元值或引用。

但是,在特殊情况下,Java虚拟机可能会执行转义分析并决定在堆栈上分配对象(包括您的对象),但这通常不会发生,也不是主要问题。LinkedList

作为一般规则,如果您在堆栈上分配对象,则当您调用引用该对象的函数时,您将获得该对象的副本。相反,如果在堆上分配一个对象,则当您将指针传递给该对象时,您将获得指针的副本(指向堆上完全相同的对象)。


答案 2

从理论上讲,JVM实现可以使用“转义分析”在堆栈上分配对象。如果可以确定对所创建对象的引用永远不会从堆栈中泄漏,则 JVM 可以将其分配给堆栈而不是堆。这样做的好处是减少垃圾回收开销;当堆栈帧退出时,可以立即回收该内存。由于参考的位置,它也可能提高速度。

从Java 7开始,逃逸分析被引入Oracle的HotSpot Java运行时。通过此增强功能,HotSpot可能会选择不分配未修改的堆栈本地对象;它不是在堆栈上分配它们,而是完全删除分配。虽然这停止了堆栈分配,但它确实表明这些事情是允许的运行时优化。

但是,Java程序员无法直接控制此行为。这是由 JIT 编译器执行的优化。我不确定语言规范是否允许在编译时进行这种优化。它可能会,但我还没有研究过它。


推荐