❶ java程序的運行機制是怎麼樣的
Java程序的運行機制悄帆可以分為以下幾個步驟:啟瞎雹
編寫Java源代碼:首先,程序員需要使用Java編程語言編寫源代碼。Java源代碼是以.java為擴展名的文本文件,包含了Java程序的邏輯和功能。
編譯Java源代碼:Java源代碼需要通過Java編譯器進行編譯,生成位元組碼文件。位元組碼文件是以.class為擴展名的二進制文件,包含了Java程序的指令、變數和方法。
解釋執行位元組碼文件:Java虛擬機(JVM)負責解釋執行位元組碼文件。JVM是一個虛擬的計算機,它模擬了實際計算機的硬體和操作系統,能夠運行位元組碼文件。
類載入:當Java程序被執行時,JVM會根據需要動態載入所需的類。Java類庫和自定義類都會被載入到內存中。
執行Java程序:JVM會按照程序的邏輯和功能執行Java程序。程序員可以在程序中使用Java類庫和自定義類提供的方法和變數。
垃圾回收:JVM還負責垃圾回收,它會自動回收不再使用的內存空間,防止程序出現內存泄漏等問題。
總的來說,Java程序的運行機制可以概括為:編寫源代碼 -> 編譯生成位元組碼文神枯件 -> 解釋執行位元組碼文件 -> 載入所需類 -> 執行Java程序 -> 垃圾回收。
❷ java 類載入機制有什麼用
AVA類載入機制詳解
「代碼編譯的結果從本地機器碼轉變為位元組碼,是存儲格式發展的一小步,卻是變成語言發展的一大步」,這句話出自《深入理解JAVA虛擬機》一書,後面關於jvm的系列文章主要都是參考這本書。
JAVA源碼編譯由三個過程組成:
1、源碼編譯機制。
2、類載入機制
3、類執行機制
我們這里主要介紹編譯和類載入這兩種機制。
一、源碼編譯
代碼編譯由JAVA源碼編譯器來完成。主要是將源碼編譯成位元組碼文件(class文件)。位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。
二、類載入
類的生命周期是從被載入到虛擬機內存中開始,到卸載出內存結束。過程共有七個階段,其中到初始化之前的都是屬於類載入的部分
載入----驗證----准備----解析-----初始化----使用-----卸載
系統可能在第一次使用某個類時載入該類,也可能採用預載入機制來載入某個類,當運行某個java程序時,會啟動一個java虛擬機進程,兩次運行的java程序處於兩個不同的JVM進程中,兩個jvm之間並不會共享數據。
1、載入階段
這個流程中的載入是類載入機制中的一個階段,這兩個概念不要混淆,這個階段需要完成的事情有:
1)通過一個類的全限定名來獲取定義此類的二進制位元組流。
2)將這個位元組流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
3)在java堆中生成一個代表這個類的Class對象,作為訪問方法區中這些數據的入口。
由於第一點沒有指明從哪裡獲取以及怎樣獲取類的二進制位元組流,所以這一塊區域留給我開發者很大的發揮空間。這個我在後面的類載入器中在進行介紹。
2、准備階段
這個階段正式為類變數(被static修飾的變數)分配內存並設置類變數初始值,這個內存分配是發生在方法區中。
1、注意這里並沒有對實例變數進行內存分配,實例變數將會在對象實例化時隨著對象一起分配在JAVA堆中。
2、這里設置的初始值,通常是指數據類型的零值。
private static int a = 3;
這個類變數a在准備階段後的值是0,將3賦值給變數a是發生在初始化階段。
3、初始化階段
初始化是類載入機制的最後一步,這個時候才正真開始執行類中定義的JAVA程序代碼。在前面准備階段,類變數已經賦過一次系統要求的初始值,在初始化階段最重要的事情就是對類變數進行初始化,關注的重點是父子類之間各類資源初始化的順序。
java類中對類變數指定初始值有兩種方式:1、聲明類變數時指定初始值;2、使用靜態初始化塊為類變數指定初始值。
初始化的時機
1)創建類實例的時候,分別有:1、使用new關鍵字創建實例;2、通過反射創建實例;3、通過反序列化方式創建實例。
new Test();
Class.forName(「com.mengdd.Test」);
2)調用某個類的類方法(靜態方法)
Test.doSomething();
3)訪問某個類或介面的類變數,或為該類變數賦值。
int b=Test.a;
Test.a=b;
4)初始化某個類的子類。當初始化子類的時候,該子類的所有父類都會被初始化。
5)直接使用java.exe命令來運行某個主類。
除了上面幾種方式會自動初始化一個類,其他訪問類的方式都稱不會觸發類的初始化,稱為被動引用。
1、子類引用父類的靜態變數,不會導致子類初始化。
執行結果:
MIGU
用final修飾某個類變數時,它的值在編譯時就已經確定好放入常量池了,所以在訪問該類變數時,等於直接從常量池中獲取,並沒有初始化該類。
初始化的步驟
1、如果該類還沒有載入和連接,則程序先載入該類並連接。
2、如果該類的直接父類沒有載入,則先初始化其直接父類。
3、如果類中有初始化語句,則系統依次執行這些初始化語句。
在第二個步驟中,如果直接父類又有直接父類,則系統會再次重復這三個步驟來初始化這個父類,依次類推,JVM最先初始化的總是java.lang.Object類。當程序主動使用任何一個類時,系統會保證該類以及所有的父類都會被初始化。
❸ 怎麼理解java中的靜態載入類和動態載入類
一.什麼是動態載入類 什麼是靜態載入類
Class.forName 不僅表示類的類類型,還代表了動態載入類。編譯時載入是靜態載入類,
運行時載入是動態載入類。
二.為何要使用動態載入類
我們寫了一個程序 並沒有寫A類和B類以及start方法?
❹ 簡述JAVA程序的編輯編譯和運行過程
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。
如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
特別說明:java類中所有public和protected的實例方法都採用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法<clinit>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。
(4)java編譯器有類載入嗎擴展閱讀:
Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。
Java代碼編譯:是由Java源碼編譯器來完成;
Java位元組碼的執行:是由JVM執行引擎來完成
Java程序從源文件創建到程序運行要經過兩大步驟:
1、源文件由編譯器編譯成位元組碼(ByteCode)
2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。
❺ JVM性能優化 —— 類載入器,手動實現類的熱載入
每個編寫的".java"拓展名類文件都存儲著需要執行的程序邏輯,這些".java"文件經過Java編譯器編譯成拓展名為".class"的文件,".class"文件中保存著Java代碼經轉換後的虛擬機指令,當需要使用某個類時,虛擬機將會載入它的".class"文件,並創建對應的class對象,將class文件載入到虛擬機的內存,這個過程稱為類載入。類載入過程如下:將class文件位元組碼內容載入到內存中,並將這些靜態數據轉換成方法區中的運行時數據結構,在堆中生成一個代表這個類的java.lang.Class對象,作為方法區類數據的訪問入口。類載入的最終產物就是位於堆中的Class對象,該對象封裝了類在方法區內的數據結構,並且向用戶提供了訪問方法區數據結構的介面。類載入的機制包括:步驟一、類載入機制,步驟二、連接過程,步驟三、初始化。類載入器的層次結構包括:啟動(Bootstrap)類載入器,擴展(Extension)類載入器,系統(System)類載入器。雙親委派模式在Java 1.2後引入,目的是避免類的重復載入,並考慮安全因素。類載入器間的關系主要可以分為以下4點:類載入器常用方法loadClass(String),findClass(String),defineClass(byte[] b, int off, int len),resolveClass(Class c)。對於Java應用程序來說,熱部署就是在運行時更新Java類文件。實現熱部署可以分以下三個步驟:第一步,了解java類的載入過程。第二步,實現熱部署與熱載入的原理及使用場景。第三步,提供相關代碼示例。最後,感謝每一位讀者,提供免費的軟體測試面試小程序和群聊資源,幫助進階自動化測試的朋友。