簡體   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