又是一年招聘季,整理一些面試題,為自己也為大家整理點資料,希望大家成功上岸。這些整理的是針對面試。因平台單日有釋出數量限制,超出限制的隻能粉絲檢視,需要的請關注後自行擷取,謝謝。
JDK,JRE以及JVM的關系
編譯器到底幹了什麼事?
僅僅是将我們的 .java 檔案轉換成了 .class 檔案,實際上就是檔案格式的轉換,對等資訊轉換。
類加載機制是什麼?
所謂類加載機制就是:
- 虛拟機把Class檔案加載到記憶體
- 并對資料進行校驗,轉換解析和初始化
- 形成可以虛拟機直接使用的Java類型,即java.lang.Class
裝載(Load):查找和導入class檔案
ClassFile--- 位元組流 ---- 類加載器
- (1)通過一個類的全限定名擷取定義此類的二進制位元組流
- (2)将這個位元組流所代表的靜态存儲結構轉化為方法區的運作時資料結構
- (3)在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區中這些資料的通路入口
連結(Link)
- 驗證(Verify):保證被加載類的正确性
- 檔案格式驗證
- 中繼資料驗證
- 位元組碼驗證
- 符号引用驗證
- 準備(Prepare):為類的靜态變量配置設定記憶體,并将其初始化為預設值
public class Demo1 {
private static int i;
public static void main(String[] args) {
// 正常列印出0,因為靜态變量i在準備階段會有預設值0
System.out.println(i);
}
}
public class Demo2 {
public static void main(String[] args) {
// 編譯通不過,因為局部變量沒有指派不能被使用
int i;
System.out.println(i);
}
}
- 解析(Resolve):把類中的符号引用轉換為直接引用
符号引用就是一組符号來描述目标,可以是任何字面量。
直接引用就是直接指向目标的指針、相對偏移量或一個間接定位到目标的句柄。
解析階段是虛拟機将常量池内的符号引用替換為直接引用的過程。
解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用限定符7類符号引用進行。
- 初始化(Initialize):對類的靜态變量,靜态代碼塊執行初始化操作 執行了Clinit方法