Java中的堆和棧的區別,Java區別

來源:互聯網
上載者:User

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為堆的最大值。

 

123456789
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為棧記憶體的大小。

1234567
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)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.