溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java的堆和棧有什么不同

發(fā)布時間:2020-06-29 15:20:13 來源:億速云 閱讀:104 作者:元一 欄目:編程語言

java的堆和棧有什么不同?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Java中存在棧這樣一個后進先出(Last In First Out)的順序的數(shù)據(jù)結(jié)構(gòu),這就是java.util.Stack。這種情況下,不免讓很多人更加費解前面的問題。事實上,堆和棧都是內(nèi)存中的一部分,有著不同的作用,而且一個程序需要在這片區(qū)域上分配內(nèi)存。眾所周知,所有的Java程序都運行在JVM虛擬機內(nèi)部,我們這里介紹的自然是JVM(虛擬)內(nèi)存中的堆和棧。

棧內(nèi)存:棧內(nèi)存首先是一片內(nèi)存區(qū)域,存儲的都是局部變量,凡是定義在方法中的都是局部變量(方法外的是全局變量),for循環(huán)內(nèi)部定義的也是局部變量,是先加載函數(shù)才能進行局部變量的定義,所以方法先進棧,然后再定義變量,變量有自己的作用域,一旦離開作用域,變量就會被釋放。棧內(nèi)存的更新速度很快,因為局部變量的生命周期都很短。

堆內(nèi)存:存儲的是數(shù)組和對象(其實數(shù)組就是對象),凡是new建立的都是在堆中,堆中存放的都是實體(對象),實體用于封裝數(shù)據(jù),而且是封裝多個(實體的多個屬性),如果一個數(shù)據(jù)消失,這個實體也沒有消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧里存放的都是單個變量,變量被釋放了,那就沒有了。堆里的實體雖然不會被釋放,但是會被當成垃圾,Java有垃圾回收機制不定時的收取。

區(qū)別

java中堆和棧的區(qū)別自然是面試中的常見問題,下面幾點就是其具體的區(qū)別:

各司其職

最主要的區(qū)別就是棧內(nèi)存用來存儲局部變量和方法調(diào)用。

而堆內(nèi)存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內(nèi)存中。

獨有還是共享

棧內(nèi)存歸屬于單個線程,每個線程都會有一個棧內(nèi)存,其存儲的變量只能在其所屬線程中可見,即棧內(nèi)存可以理解成線程的私有內(nèi)存。

而堆內(nèi)存中的對象對所有線程可見。堆內(nèi)存中的對象可以被所有線程訪問。

異常錯誤

如果棧內(nèi)存沒有可用的空間存儲方法調(diào)用和局部變量,JVM會拋出java.lang.StackOverFlowError。

而如果是堆內(nèi)存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。

空間大小

棧的內(nèi)存要遠遠小于堆內(nèi)存,如果你使用遞歸的話,那么你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發(fā)生StackOverFlowError問題。

你可以通過-Xss選項設置棧內(nèi)存的大小。-Xms選項可以設置堆的開始時的大小,-Xmx選項可以設置堆的最大值。

這就是Java中堆和棧的區(qū)別。理解好這個問題的話,可以對你解決開發(fā)中的問題,分析堆內(nèi)存和棧內(nèi)存使用,甚至性能調(diào)優(yōu)都有幫助。

優(yōu)勢對比

棧的優(yōu)勢:

存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。棧有一個很重要的特殊性,就是存在棧中的數(shù)據(jù)可以共享。

堆優(yōu)勢:

1.每一個實體都有首地址值。

2.堆內(nèi)存中的每一個變量都有默認的初始化數(shù)值,根據(jù)類型的不同而變化。(如:整數(shù)為0,小數(shù)為0.0)。

3.垃圾回收機制。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI