一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

java語(yǔ)言

java中堆和棧的區別

時(shí)間:2025-01-13 21:11:02 java語(yǔ)言 我要投稿

關(guān)于java中堆和棧的區別

  當一個(gè)人開(kāi)始學(xué)習Java或者其他編程語(yǔ)言的時(shí)候,會(huì )接觸到堆和棧,由于一開(kāi)始沒(méi)有明確清晰的說(shuō)明解釋?zhuān)芏嗳藭?huì )產(chǎn)生很多疑問(wèn),什么是堆,什么是棧,堆和棧有什么區別?更糟糕的是,Java中存在棧這樣一個(gè)后進(jìn)先出(Last In First Out)的順序的數據結構,這就是java.util.Stack。這種情況下,不免讓很多人更加費解前面的問(wèn)題。事實(shí)上,堆和棧都是內存中的一部分,有著(zhù)不同的作用,而且一個(gè)程序需要在這片區域上分配內存。眾所周知,所有的Java程序都運行在JVM虛擬機內部,我們這里介紹的自然是JVM(虛擬)內存中的堆和棧。

  區別

  java中堆和棧的區別自然是面試中的常見(jiàn)問(wèn)題,下面幾點(diǎn)就是其具體的區別

  各司其職

  最主要的區別就是棧內存用來(lái)存儲局部變量和方法調用。

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

  獨有還是共享

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

  而堆內存中的對象對所有線(xiàn)程可見(jiàn)。堆內存中的對象可以被所有線(xiàn)程訪(fǎng)問(wèn)。

  異常錯誤

  如果棧內存沒(méi)有可用的空間存儲方法調用和局部變量,JVM會(huì )拋出java.lang.StackOverFlowError。

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

  空間大小

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

  你可以通過(guò)-Xss選項設置棧內存的大小。-Xms選項可以設置堆的開(kāi)始時(shí)的大小,-Xmx選項可以設置堆的最大值。

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

  查看默認值(Updated)

  查看堆的默認值,使用下面的代碼,其中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)

  查看棧的默認值,其中ThreadStackSize為棧內存的大小。

  復制代碼 代碼如下:

  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)

  譯文信息

  原汁原味的英文原文:http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.

  譯文在原文基礎上進(jìn)行了修改,整理,刪減。如有興趣可以訪(fǎng)問(wèn)原文。P.S.地址已被墻。

【java中堆和棧的區別】相關(guān)文章:

Java中的堆和棧的區別10-01

c語(yǔ)言指針運用中堆和棧的區別10-06

Java堆、棧和常量池的解釋09-16

C語(yǔ)言中堆和棧的區別有哪些08-12

分析Java內存分配的棧和堆以及常量池06-24

java中length和length()的區別08-24

java中String和StringBuffer的區別08-01

Java中hashmap和hashtable的區別06-20

詳解C/C++中堆和棧及靜態(tài)數據區11-02

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看