jvm內存分佈圖
- 線程獨有內存:程序計數器,虛擬機棧,本地方法
- 非線程獨有:方法區,堆
- 程序計數器:用於記錄當前線程的字節碼行數,是線程獨有,該內存區域是Java虛擬機唯一沒有規定任何OutOfMemoryError的區域。
- 虛擬機棧:用於存儲局部變量,是線程獨有,局部變量是在編譯的時候已經確認後,方法運行時候的棧是已經確認好的。虛擬機棧規定了2種異常情況,一種是線程請求棧的深度大於虛擬機棧所允許的深度,這時候將會拋出StackOverflowError異常,如果當Java虛擬機允許動態擴展虛擬機棧的時候,當擴展的時候沒辦法分配到內存的時候就會報OutOfMemoryError異常。
- 本地方法棧:與虛擬機棧類似,只是本地方法執行native方法。
- 堆:存儲所有線程的共享對象實例,可以動態擴展,當沒有內存進行擴展的時候,堆拋出OutOfMemoryError異常。
- 方法區:這個也是線程共享的內存區域,存儲被虛擬機加載的類信息、常量、靜態變量、即時編譯的代碼數據等。方法區一般很少回收,經常被稱爲永久區,但也是可以被回收,主要針對常量與類型的卸載。在方法區也規定當方法區無法滿足內存分佈的時候,將會拋出OutOfMemoryError異常
-
虛擬機堆棧參數設置
-
-Xss 每個棧的大小
-Xms 初始化堆大小,-Xmx 最大堆大小