<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            java中堆和棧的區別

            時間:2025-01-13 21:11:02 java語言 我要投稿

            關于java中堆和棧的區別

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

              區別

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

              各司其職

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

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

              獨有還是共享

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

              而堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問。

              異常錯誤

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

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

              空間大小

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

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

              這就是Java中堆和棧的區別。理解好這個問題的話,可以對你解決開發中的問題,分析堆內存和棧內存使用,甚至性能調優都有幫助。

              查看默認值(Updated)

              查看堆的默認值,使用下面的代碼,其中InitialHeapSize為最開始的堆的大小,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.

              譯文在原文基礎上進行了修改,整理,刪減。如有興趣可以訪問原文。P.S.地址已被墻。

            【java中堆和棧的區別】相關文章:

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

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

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

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

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

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

            java中String和StringBuffer的區別08-01

            Java中hashmap和hashtable的區別06-20

            詳解C/C++中堆和棧及靜態數據區11-02

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看