繁体   English   中英

当我在程序中创建堆栈时,为什么它存储在堆中而不是堆栈中?

[英]When i create a stack in the program, why it is storing in heap not stack?

如果我使用Deque<Integer> stack = new LinkedList<Integer>();在java方法中创建堆栈,则Deque<Integer> stack = new LinkedList<Integer>(); 为什么此堆栈变量存储在堆中而不存储在堆栈中?

Java堆空间

Java运行时使用Java堆空间为Objects和JRE类分配内存。 每当我们创建任何对象时,它总是在堆空间中创建。

垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存。 在堆空间中创建的任何对象都具有全局访问权限,并且可以从应用程序的任何位置进行引用。


Java堆栈内存

Java Stack内存用于执行线程。 它们包含短期的方法特定值,以及从该方法引用的对堆中其他对象的引用。

堆栈存储器始终按LIFO(后进先出)顺序引用。 每当调用方法时,都会在堆栈存储器中创建一个新块,以容纳该方法的本地原始值并引用该方法中的其他对象。

方法结束后,该块将立即变为未使用状态,并可用于下一个方法。 与堆内存相比,堆栈内存的大小要小得多。


因此,当您使用Deque stack = new LinkedList<>()Deque stack是根据数据模型进行堆栈的,但是根据JVM,这只是另一个对象 ,如new Object()new ArraList<>()等。这些对象被存储在堆中

Java堆空间与堆栈中查看详细信息– Java中的内存分配

诸如C类的某些语言允许您选择是在堆栈还是在堆上分配内存。 有许多吸引人的原因,为什么您想使用堆栈。 当“弹出”堆栈帧(函数返回)时,将自动free在堆栈上分配的内存。 您还可以获得更好的性能,因为堆栈是连续的内存块,而内存可以分配到堆上的任何位置。 编译器更容易优化。

但是,就像C许多方面一样,这里还有龙。 线程安全或共享数据是不可能的。 无论您在堆栈上分配的内容是什么,都不一定会超出函数调用的寿命。 函数返回时,将释放堆栈上的对象,因此,如果需要从函数返回对象,则必须在堆上分配该对象。

堆栈分配可能很危险,并且需要对程序的内存使用情况有较低的了解。 这些违反了Java的设计原则,即您应该能够让计算机为您处理内存管理。 因此,语言设计师只是决定不让您这样做。 由于Oleg已经共享,因此在Java中,所有对象都分配在堆上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM