JAVA代碼的執行
- Java源碼 在Java編譯器中 經過一系列的加工稱.classs文件。
- 將.class文件放置到java虛擬機【JVM】。
- Java續集你使用類加載器加載class文件。
- 類加載器加載完成之後,對字節碼進行校驗,字節碼校驗通過後JVM吧字節碼翻譯成機器碼交給操作系統執行。
Java編譯器 .java源碼 在Java編譯器中【詞法分析、語法分析、語義分析、字節碼生成器】變成.class文件
Java虛擬機 .class文件放入JVM中【類加載器、字節碼校驗、翻譯機器碼,編譯執行】
所以JVM是java實現跨平臺的關鍵。
字節碼
如果某個程序因爲不同硬件平臺需要編寫多套代碼,是十分領人崩潰的,而Java可以一次編寫,到處執行。Java的跨平臺是通過增加一箇中間層來解決,字節碼"Bytecode"就是該中間層.Java所有執行有200個左右,一個字節(8位)可以存儲256種不同的指令信息,一個這樣的字節稱之爲"字節碼"。JVM可以將字節碼編譯執行,如果是熱點代碼,或通過JIT動態的編譯爲機器碼,提高執行效率。
熱點代碼:JVM虛擬機判定熱點代碼的方式有兩種:
- 採樣熱點判定
主要是虛擬機週期性檢查各個線程的棧頂,若某個方法經常出現在棧頂,那麼這個方法就是熱點方法。 - 計數器熱點判定
虛擬機給每個方法甚至代碼塊簡歷一個計數器,統計方法的執行次數,超過一定閥值標記此方法爲熱點方法。【在Client模式下閥值1500,Server是10000】
在Java編譯器中此法解析是通過空格分割出的單詞、操作符、控制符等信息,將其形成token信息流,傳遞給語法解析器,語法解析器把token信息流按照Java語法規範組裝成一顆語法樹,在語義分析階段,需要檢查關鍵字使用的是否合理、類型是否匹配、作用域是否正確,當語義解析完成後即可生成字節碼。
字節碼必須經過類加載器加載到JVM環境後纔可以執行。執行有三種模式:
- 解釋執行
- JIT編譯執行
- JIT編譯與解釋混合執行
類加載
ClassLoader是提前加載.class文件到CPU中執行,在加載類時,使用的是"雙親委派模式"。
- Load階段讀取類文件,產生二進制流,並轉換爲特定的數據結構,然後創建對應類的java.lang.Class實例。
- Link階段包括驗證,準備,解析三個步驟。驗證是更加詳細的校驗,比如final是否合規,數據類型是否正確。
- Init階段執行類構造器。
垃圾回收機制
Java會對內存進行自動分配與回收管理,是上層業務更加安全。垃圾回收(Garbage Collection GC)。垃圾回收主要是清除不在使用的對象,自動釋放內存。
- 判斷對象是否存活。
JVM引入了GC Roots。如果一個對象與GC Roots之間沒有直接或間接的引用關係(某個失去任何引用的對象,或者兩個相互引用的對象)判決這些對象的狀態是準備回收尚未回收。
垃圾回收器是實現垃圾回收算法並且應用在JVM環境中的內存管理模塊。
實現垃圾回收器可以參考
https://www.cnblogs.com/jalja365/archive/2020/01/12/12182064.html