堆内存-Java可以在堆栈上分配一个列表



每次在java中启动列表时,我都会执行

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

我认为这将在堆上分配列表。不知道我是否可以在堆栈上分配列表?

所有对象,包括它们各自的属性,都存储在堆中。

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

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

一般来说,如果你在堆栈上分配一个对象,当你调用一个引用它的函数时,你会得到一个对象的副本。相反,如果你分配堆上的一个对象时,当你把指针传给对象时,你就会得到一个指针的副本(它指向堆上的同一个对象)

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

从Java7开始,转义分析被引入到Oracle的HotSpotJava运行时中。通过此增强,HotSpot可以选择不分配未修改的堆栈本地对象;它不是在堆栈上分配它们,而是完全删除分配。虽然这还没有达到堆栈分配,但它确实证明了这些事情是允许的运行时优化。

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

最新更新