- java中堆和棧的區(qū)別 推薦度:
- 相關(guān)推薦
Java中的堆和棧的區(qū)別
當(dāng)一個(gè)人開(kāi)始學(xué)習(xí)Java或者其他編程語(yǔ)言的時(shí)候,會(huì)接觸到堆和棧,由于一開(kāi)始沒(méi)有明確清晰的說(shuō)明解釋,很多人會(huì)產(chǎn)生很多疑問(wèn),什么是堆,什么是棧,堆和棧有什么區(qū)別?下面小編給大家介紹Java中的堆和棧的區(qū)別,歡迎閱讀!
java中堆和棧的區(qū)別自然是面試中的常見(jiàn)問(wèn)題,下面幾點(diǎn)就是其具體的區(qū)別
各司其職
最主要的區(qū)別就是棧內(nèi)存用來(lái)存儲(chǔ)局部變量和方法調(diào)用。
而堆內(nèi)存用來(lái)存儲(chǔ)Java中的對(duì)象。無(wú)論是成員變量,局部變量,還是類變量,它們指向的對(duì)象都存儲(chǔ)在堆內(nèi)存中。
獨(dú)有還是共享
棧內(nèi)存歸屬于單個(gè)線程,每個(gè)線程都會(huì)有一個(gè)棧內(nèi)存,其存儲(chǔ)的變量只能在其所屬線程中可見(jiàn),即棧內(nèi)存可以理解成線程的私有內(nèi)存。
而堆內(nèi)存中的對(duì)象對(duì)所有線程可見(jiàn)。堆內(nèi)存中的對(duì)象可以被所有線程訪問(wèn)。
異常錯(cuò)誤
如果棧內(nèi)存沒(méi)有可用的空間存儲(chǔ)方法調(diào)用和局部變量,JVM會(huì)拋出java.lang.StackOverFlowError。
而如果是堆內(nèi)存沒(méi)有可用的空間存儲(chǔ)生成的對(duì)象,JVM會(huì)拋出java.lang.OutOfMemoryError。
空間大小
棧的內(nèi)存要遠(yuǎn)遠(yuǎn)小于堆內(nèi)存,如果你使用遞歸的話,那么你的棧很快就會(huì)充滿。如果遞歸沒(méi)有及時(shí)跳出,很可能發(fā)生StackOverFlowError問(wèn)題。
你可以通過(guò)-Xss選項(xiàng)設(shè)置棧內(nèi)存的大小。-Xms選項(xiàng)可以設(shè)置堆的開(kāi)始時(shí)的大小,-Xmx選項(xiàng)可以設(shè)置堆的最大值。
這就是Java中堆和棧的區(qū)別。理解好這個(gè)問(wèn)題的話,可以對(duì)你解決開(kāi)發(fā)中的問(wèn)題,分析堆內(nèi)存和棧內(nèi)存使用,甚至性能調(diào)優(yōu)都有幫助。
查看默認(rèn)值(Updated)
查看堆的默認(rèn)值,使用下面的代碼,其中InitialHeapSize為最開(kāi)始的堆的大小,MaxHeapSize為堆的最大值。
13:17 $ java -XX:+PrintFlagsFinal -version | grep HeapSize
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 134217728 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2147483648 {product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
查看棧的默認(rèn)值,其中ThreadStackSize為棧內(nèi)存的大小。
13:21 $ java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
【Java中的堆和棧的區(qū)別】相關(guān)文章:
c語(yǔ)言指針運(yùn)用中堆和棧的區(qū)別10-06
Java堆、棧和常量池的解釋09-16
java中l(wèi)ength和length()的區(qū)別08-24
java中String和StringBuffer的區(qū)別08-01