------------恢復內容開始------------
把檔案編譯成位元組碼檔案的叫編譯器的前端,
執行緒共享的方法去和堆,非執行緒共享的:java虛擬機器棧,本地方法棧,還有程式計數器 都是每個執行緒獨有一份的
執行引擎叫做編譯器的後端
執行引擎,分為直譯器,jit即時編譯器,以及垃圾回收器這三部分包含在執行引擎當中
當位元組碼檔案載入到記憶體中下一步要開始解釋運行了,解釋執行用到的就是直譯器
當存在反覆執行的熱點程式碼的時候就用到jit的即時編譯器
兩次編譯,第一次編譯成位元組碼檔案,第二次編譯的時候把反覆執行的熱點程式碼通過jit編譯器編譯成機器指令,同時快取起來放在方法區,提高虛擬機器效能
根據棧的方式和暫存器的方式
int i = 2+3; 編譯之後直接2+3
int i =2;
int j =3;
int z = i + j;
位元組碼檔案如下 定義了一個常量2 , istore_1 就是運算元棧的索引位置 ,儲存到1的運算元棧當中,
定義3,儲存到索引2當中,
然後把i和j載入進來,進行求和的操作
類的載入器分為引導類載入器,擴充套件類載入器,系統類載入器
執行中輸入jps可以檢視執行中的程式的程序號
runntime 執行時類 ,餓漢式 單例
獲取到當前的唯一的例項,將當前的程序結束掉
主流的直譯器和即時編譯器都需要有
for迴圈如果沒有jit即使編譯器每次迴圈都要逐行解釋,而有了jit即時編譯器可以把熱點程式碼即時編譯
棧可知記憶體地址,減少開銷
最重要的虛擬機器,hotspot
類載入子系統 載入->連結->初始化 同時載入需要用到的載入器,引導類載入器,擴充套件類載入器,還有系統類載入器,
linking 分為 驗證,準備,解析
初始化,涉及到靜態變數的現實初始化
執行時資料區 每一個執行緒一份程式計數器
棧就是虛擬機器棧 stack frame 棧幀; LV區域性變量表, OS運算元棧 DL動態連結 RA方法返回地址(棧幀具體的細節)
而什麼是棧幀(Stack Frame)呢?
每一次函式的呼叫,都會在呼叫棧(call stack)上維護一個獨立的棧幀(stack frame).每個獨立的棧幀一般包括:
- 函式的返回地址和引數
- 臨時變數: 包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數
- 函式呼叫的上下文
棧是從高地址向低地址延伸,一個函式的棧幀用ebp 和 esp 這兩個暫存器來劃定範圍.ebp 指向當前的棧幀的底部,esp 始終指向棧幀的頂部;
ebp 暫存器又被稱為幀指標(Frame Pointer);
esp 暫存器又被稱為棧指標(Stack Pointer);