------------恢復內容開始------------

把檔案編譯成位元組碼檔案的叫編譯器的前端,

執行緒共享的方法去和堆,非執行緒共享的: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);