jvm二:类加载,连接,初始化
? 在java代碼中,類型的加載,連接與初始化過程都是在程序運行期間完成的。
? 這種方式提供了更大的靈活性,增加了更多的可能性。
?
?動態代理的類型在運行期間才被創建出來,在編譯期間是不存在的。
?
類的加載,連接,初始化
?1.常見的加載方式:
? ? ? ? ? 將已經編寫好的類的class文件從磁盤上加載到內存中。(查找并加載類的二進制數據)
? ? ? ? ?將類的.class文件中二進制數據讀入到內存中,將其放在運行時數據區的方法去內,然后在內存中創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構.
? ? ?加載.class文件的方式:?
? ? ? ? ? ? ? ? ?1. 從本地系統中直接加載 ? 2. 通過網絡下載.class文件 ? 3. 從.zip,jar等歸檔文件中加載.class文件 ?4. 從專有數據庫中提取.class文件 ? 5. 將java源文件動態編譯為.class文件
2.連接:
? ? ? ? 將類與類之間的關系確定好,還有一些類的校驗等。
? ? ? ? ?驗證: 確保被加載的類的正確性
? ? ? ? ?準備: 為類的靜態變量分配內存,并將其初始化為默認值。
? ? ? ? ?解析: 把類中的符號引用轉換為直接引用。
3.初始化:
? ? ? ? ? 為類的靜態變量賦予正確的初始值。
類加載器:
? ? java里的每一個類型,都會被類加載器加載到jvm的管轄范圍內,也就是加載到內存中。
?
? java虛擬機將結束生命周期的幾種情況:
1. 執行了System.exit()方法 ? ? 2. 程序正常執行結束 ? 3. 程序在執行過程中遇到了異常或錯誤而異常終止 ? 4. 由于操作系統出現錯誤而導致java虛擬機進程終止。
?
java程序對類的使用方式可分為兩種 1.主動使用 ? ?2. 被動使用
所有的java虛擬機實現必須在每個類或接口被java程序"首次主動使用"時才初始化他們。(初始化只會被執行一次)
?
主動使用的幾種情況:?
? ? 1. 創建類的實例.(new 一個對象) ? ?2. 訪問某個類或接口的靜態變量,或者對該靜態變量賦值。 ?3. 調用類的靜態方法。
? ? 4. 反射(如 Class.forName("com.test.People")) ?5.初始化一個類的子類. ? ? 6.java虛擬機啟動時被標明為啟動類的類(也可以理解為包含main方法的類)
package com.atChina.jvm;public class Test {public static void main(String[] args){// 雖然是通過子類調用父類的靜態變量// 但靜態變量屬于父類的,這是主動使用了父類,所有只有父類被初始化,只執行了父類的static代碼塊// 換句話說,對于靜態變量,只有直接定義了該字段的類才會被初始化// System.out.println(Son.f); // 初始化一個類的子類,父類的也會被初始化System.out.println(Son.s);} } class Father{public static String f = "劉備";static{System.out.println("桃園結義");} }class Son extends Father{public static String s = "劉禪";static{System.out.println("樂不思蜀");} }?
總結
以上是生活随笔為你收集整理的jvm二:类加载,连接,初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm一:常用工具
- 下一篇: Linux查看tomcat 控制台输出命