溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何區(qū)別Java的堆和棧?

發(fā)布時(shí)間:2020-05-26 11:07:36 來(lái)源:億速云 閱讀:189 作者:Leah 欄目:編程語(yǔ)言

  如何區(qū)別Java的堆和棧?相信大部分人都還沒學(xué)會(huì)這個(gè)技能,為了讓大家學(xué)會(huì),給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。

如何區(qū)別Java的堆和棧?

  從優(yōu)勢(shì)及不足進(jìn)行分析

  堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。缺點(diǎn)是由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

  棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。缺點(diǎn)是存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。另外,棧數(shù)據(jù)可以共享。

  從存儲(chǔ)對(duì)象和歸屬分析

  堆可以理解為內(nèi)存中一片分散的區(qū)域,堆內(nèi)存用來(lái)存儲(chǔ)Java中的對(duì)象。無(wú)論是成員變量,局部變量,還是類變量,它們指向的對(duì)象都存儲(chǔ)在堆內(nèi)存中。堆內(nèi)存中的對(duì)象對(duì)所有線程可見,堆內(nèi)存中的對(duì)象可以被所有線程訪問。

  ??梢岳斫鉃閮?nèi)存中一片連續(xù)的區(qū)域。棧內(nèi)存歸屬于單個(gè)線程,每個(gè)線程都會(huì)有一個(gè)棧內(nèi)存,其存儲(chǔ)的變量只能在其所屬線程中可見,即棧內(nèi)存可以理解成線程的私有內(nèi)存。

  從異常錯(cuò)誤和空間大小分析

  想要進(jìn)一步理解堆和棧的關(guān)系,我們需要了解JVM和垃圾回收機(jī)制。通常來(lái)說,new創(chuàng)建的實(shí)例化對(duì)象及數(shù)組,是存放在堆內(nèi)存中的,用完之后靠垃圾回收機(jī)制不定期自動(dòng)消除?;緮?shù)據(jù)類型、局部變量都是存放在棧內(nèi)存中的,用完就消失。

  如果是堆內(nèi)存沒有可用的空間存儲(chǔ)生成的對(duì)象,JVM會(huì)拋出java.lang.OutOfMemoryError。如果棧內(nèi)存沒有可用的空間存儲(chǔ)方法調(diào)用和局部變量,JVM會(huì)拋出java.lang.StackOverFlowError。棧的內(nèi)存要遠(yuǎn)遠(yuǎn)小于堆內(nèi)存,如果你使用遞歸的話,那么你的棧很快就會(huì)充滿。如果遞歸沒有及時(shí)跳出,很可能發(fā)生StackOverFlowError問題。

  綜合來(lái)看,堆和棧都是內(nèi)存中的一部分,有著不同的作用,而且一個(gè)程序需要在這片區(qū)域上分配內(nèi)存。如果你想成為一個(gè)好的Java工程師,一定要熟練掌握并明確區(qū)分堆與棧。

  以上就是區(qū)別Java的堆和棧的方法了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊!

向AI問一下細(xì)節(jié)

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

AI