回覆列表
  • 1 # 使用者7035259253219

    各司其職

    最主要的區別就是棧記憶體用來儲存區域性變數和方法呼叫。而堆記憶體用來儲存Java中的物件。無論是成員變數,區域性變數,還是類變數,它們指向的物件都儲存在堆記憶體中。

    獨有還是共享

    棧記憶體歸屬於單個執行緒,每個執行緒都會有一個棧記憶體,其儲存的變數只能在其所屬執行緒中可見,即棧記憶體可以理解成執行緒的私有記憶體。而堆記憶體中的物件對所有執行緒可見。堆記憶體中的物件可以被所有執行緒訪問。

    異常錯誤

    如果棧記憶體沒有可用的空間儲存方法呼叫和區域性變數,JVM會丟擲java.lang.StackOverFlowError。而如果是堆記憶體沒有可用的空間儲存生成的物件,JVM會丟擲java.lang.OutOfMemoryError。

    空間大小

    棧的記憶體要遠遠小於堆記憶體,如果你使用遞迴的話,那麼你的棧很快就會充滿。如果遞迴沒有及時跳出,很可能發生StackOverFlowError問題。你可以透過-Xss選項設定棧記憶體的大小。-Xms選項可以設定堆的開始時的大小,-Xmx選項可以設定堆的最大值。

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

    具體可以訪問我的翻譯文章 Java中的堆和棧的區別

  • 中秋節和大豐收的關聯?
  • 長安凌軒和歐尚a800哪個好?