程序計數器:作用可以看成當前線程所執行的字節碼的行號指示器。為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間的計數器互不影響,獨立存儲。---線程私有
虛擬機棧:描述JAVA方法執行的內存模型,每個方法被執行的時候都會同時創建一個棧幀用于存儲局部變量表,操作數棧,動態鏈接,方法出口燈信息。每個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。局部變量表存放了編譯期可知的各種基本數據類型和對象引用類型,所需內存空間在編譯期間完成分配。---線程私有
虛擬機棧中的兩種異常狀況:如果線程請求的棧深度大于虛擬機允許的深度,拋出StackOverflowError;如果虛擬機棧可以動態擴展,當擴展無法申請到足夠的內存時拋出OutOfMemoryError。
本地方法棧:為虛擬機使用到的Native方法服務。---線程私有
JAVA堆:是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。所有的對象實例以及數組都要在堆中分配,垃圾收集器管理的主要區域。
方法區:存儲被虛擬機加載的類信息(類名、訪問修飾符、字段描述、方法描述等)、常量、靜態變量、即時編譯器編譯后的代碼等數據。垃圾收集器主要是針對該區域的常量的回收和對類型的卸載。
運行時常量池(屬于方法區部分):存放編譯期生成的各種字面量和符號引用。動態性:運行期間也可能將新的常量放入池中,如String類的intern()方法。
直接內存:堆外內存,新IO類中引入的機遇通道Channel與緩沖的I/O方式,使用Native函數庫直接分配對外內存。
配置參數:
- -Xnoclassgc 關閉類垃圾回收功能
- -Xincgc 開啟類的垃圾回收功能
- –Xms<size> 設置JVM初始化堆內存大小
- –Xmx<size> 設置JVM最大的堆內存大小
- –Xss<size> 設置JVM棧內存大小