JVM
JVM - Java虛擬機
我們編寫的 Java 程序, 是不能夠被 OS 直接識別的
JVM 充當翻譯官的角色, 負責把我們寫的的 Java 程序 ,翻譯給 OS “聽”, 讓 OS 能夠識別我們所寫的 Java 代碼
JVM 內存區域劃分
JVM 是一個應用程序, 在啟動的時候, 會從 操作系統 申請到一整塊很大的內存區域
并且 JVM 會根據需要, 將整個內存區域, 根據功能進行劃分
JVM運行時數據區(內存布局)
Native Method Stacks (本地方法棧) : 存儲本地方法 (JVM 內部方法) 之間的調用關系
- 線程私有
Program Counter Register (程序計數器) : 記錄當前線程執行到哪個命令
- 線程私有
JVM Stacks (虛擬機棧) : 描述 Java 方法執行的內存模型
- 線程私有
- 整個棧空間內部,可以任務是包含很多個元素, 每個元素表示一個方法, 每個元素稱為一個 “棧幀” ,每個棧幀里會包含該方法的 入口地址,方法參數,返回地址, 形參, 局部變量 …
Heap (堆區) : 整個 JVM 空間最大的區域, 存儲程序中創建的所有的對象.
- 線程共享
- 堆里面分為兩個區域 : 新生代和老生代 ( 新生代包含三個區域: 一個Endn+ 和兩個 Survivor(S0/S1) )
Metaspace (元數據區/方法區) : 存儲類對象, 常量池, 靜態成員
- 線程共享
- 一個進程只有一塊, 多個線程共用
對給出的一段代碼, 判斷某個變量在哪個區域上?
遵循原則:
- 局部變量在 棧
- 普通成員變量在 堆
- 靜態成員變量在 方法區/元數據區