Java基礎
- Javac 編譯Java檔案成爲。class檔案
- javap 是jdk自帶的反編譯工具
JVM 如何載入.class檔案
- ClassLoader: 依據特定的格式將檔案載入到記憶體
- Execution Engine: 對命令進行解釋
- Nactive Interface: 融合不同開發語言的原生庫爲Java所用
- Runtime Data Area: Java記憶體空間模型
反射
Class:
- 是一個類; 一個描述類的類.
- 封裝了描述方法的 Method,
- 描述欄位的 Filed,
- 描述構造器的 Constructor 等屬性.
如何得到 Class 物件:
- Person.class
- person.getClass()
- Class.forName(「com.atguigu.javase.Person」)
Method:
如何獲取 Method
- getDeclaredMethods: 得到 Method 的陣列.
- getDeclaredMethod(String methondName, Class … parameterTypes)
如何呼叫 Method
- 如果方法時 private 修飾的, 需要先呼叫 Method 的 setAccessible(true), 使其變爲可存取
- method.invoke(obj, Object … args);
Field:
如何獲取 Field:
- getField(String fieldName)-
如何獲取 Field 的值:
- setAccessible(true)
- field.get(Object obj)
如何設定 Field 的值:
- field.set(Obejct obj, Object val)
ClassLoader
BootStrapClassLoader(引導類載入器)
- 處於類載入器層次結構的最高層,負責 sun.boot.class.path 路徑下類的載入,預設爲 jre/lib 目錄下的核心 API 或 -Xbootclasspath 選項指定的 jar 包。
ExtClassLoader (擴充套件類載入器)
- 載入路徑爲 java.ext.dirs,預設爲 jre/lib/ext 目錄或者 -Djava.ext.dirs 指定目錄下的 jar 包載入。
AppClassLoader(系統類載入器)
- 載入路徑爲 java.class.path,預設爲環境變數 CLASSPATH 中設定的值。也可以通過 -classpath 選型進行指定。
使用者自定義 ClassLoader
- 可以根據使用者的需要定製自己的類載入過程,在執行期進行指定類的動態實時載入。
雙親委託
- 每個classLoader都從自己已經載入的類中查詢是否存在需要的類,如果存在直接返回已經載入的類,每個類載入器都有自己的載入快取,當一個類被載入後,會直接放入快取
- 當前classLoader中不存在,則委託給父載入器去載入,依次遞回,一直到bootstrp ClassLoader
- 如果沒有則從對應得目錄中載入,從最高層向下載入;
優勢
類的載入
- 當程式主動使用某一個類時,如果該類沒被載入到記憶體中,系統會經過載入,連線,初始化三個步驟來對類進行初始化, 一般JVM會連續完成三個步驟,所以三個各步驟統稱爲 類的載入或類初始化
類載入
- 類的載入時指將類的class 檔案讀入記憶體,併爲之建立一個java.lang.Class物件,當程式使用任何類的時候 系統都會爲之建立一個java.lang.Class物件
類的連線
- 當類被載入之後,系統爲之生成一個對應得Class物件,接着將會進入連線階段,連線階段把類的二進制檔案數據合併到JRE中
驗證
- 驗證階段用於檢驗被載入的類是否有正確的內部結構,並和其他類協調一致
準備
類準備階段則負責爲類的類變數分配記憶體,並設定預設初始值
解析
將類的二進制數據中的符號參照替換爲直接參照
物件分配規則
- 物件優先分配在Eden區,如果Eden區沒有足夠的空間時候,虛擬機器執行一次Minor GC。
- 大物件直接進入老年代(大物件是指需要大量連續記憶體空間的物件)這樣做的目的是避免Eden區和兩個Survivor區之間發生大量的記憶體拷貝(新生代採用複製演算法收集記憶體)
- 長期存活的物件進入老年代,虛擬機器爲每個物件定義了一個年齡計數器,如果物件經過一次Minor GC 那麼物件會進入Survivor區,之後每經過一次Minor GC ,那麼物件的年齡增加1,直到達到閾值,物件進入老年代
- 動態判斷物件的年齡.如果Survivor區中相同年齡的所有物件大小的總和大於Survivor空間的一半,年齡大於或者等於該年齡的物件可以直接進入老年代
- 空間分配擔保。每次進行Minor Gc的時候,JVM會計算Survior區移至老年區的物件的平均大小,如果這個值大於老年區的剩餘價值大小進行一次FullGC, 如果小於 ,檢查HandlePromotionFailure設定,如果true則只進行進行Monitor GC,如果false 則進行fullGC
LoadClass和forName的區別
-
類的載入過程分爲 載入—鏈接(鏈接又分爲驗證,準備,解析三個階段)—初始化
-
Class.forName得到的是已經初始化完成的,即類的載入過程已經完成了
-
而Class.loadClass得到的class是還沒有鏈接的,即只是通過了類載入過程的載入階段,通過ClassLoader載入class載入檔案位元組碼,將其放在執行時數據區的方法區內,在堆區建立一個java.lang.Class物件(用來封裝類在方法區內的數據結構)
-
在spring IOC中 大量使用這種載入方式,木的還是爲了提高載入速度,而剩餘的階段則等到實際使用到類的時候才執行