Java中程序的運(yùn)行全過程
Java程序運(yùn)行過程
運(yùn)行一個(gè)Java程序的步驟
1、編輯源代碼xxx.java
2、編譯xxx.java文件生成字節(jié)碼文件xxx.class
3、JVM中的類加載器加載字節(jié)碼文件
4、JVM中的執(zhí)行引擎找到入口方法main(),執(zhí)行其中的方法
一、從源碼到字節(jié)碼
從我們寫的java文件到通過編譯器編譯成java字節(jié)碼文件(也就是.class文件),這個(gè)過程是java編譯過程;
字節(jié)碼文件:真正實(shí)現(xiàn)了java語言的跨平臺。各種不同平臺的虛擬機(jī)都統(tǒng)一使用這種相同的程序存儲格式。
更進(jìn)一步說,jvm運(yùn)行的是class字節(jié)碼文件,只要是這種格式的文件就行,所以,實(shí)際上jvm并不像我之前想象地那樣與java語言緊緊地捆綁在一起。
把一個(gè)簡單的HelloWorld程序生成的字節(jié)碼文件重定向?yàn)閠xt文件:
javap -v HelloWorld > HelloWorld.class.txt,部分信息如下
一份字節(jié)碼文件包含了魔數(shù)與 Class 文件的版本,常量池,訪問標(biāo)志等等信息,總之,字節(jié)碼文件很簡單很強(qiáng)大,它存放了這個(gè)類的各種信息:字段、方法、父類、實(shí)現(xiàn)的接口等各種信息。
二、JVM虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)
Java虛擬機(jī)要運(yùn)行字節(jié)碼指令,就要先加載字節(jié)碼文件,誰來加載,怎么加載,加載到哪里……誰來運(yùn)行,怎么運(yùn)行呢?
JVM在執(zhí)行Java程序的過程中會(huì)把它所管理的內(nèi)存分為若干個(gè)不同的區(qū)域,這些區(qū)域都有各自的用途。
1、程序計(jì)數(shù)器:可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器(指示當(dāng)前線程,所以是線程私有的),字節(jié)碼解釋器工作時(shí)需要通過改變這個(gè)程序計(jì)數(shù)器的值來選取下一條所需要執(zhí)行的字節(jié)碼指令,循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都要依賴它來完成。
2、JVM棧:描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,用于存儲局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接和方法出口等信息。每一個(gè)方法從調(diào)用直到執(zhí)行完成的過程,就對應(yīng)一個(gè)棧幀從虛擬機(jī)棧中入棧到出棧的過程。
3、本地方法棧:虛擬機(jī)棧執(zhí)行的是Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)所使用到的Native方法服務(wù)。
4、堆:是被所有線程共享的一塊區(qū)域,在虛擬機(jī)創(chuàng)建是創(chuàng)建,此內(nèi)存的唯一目的是存放對象實(shí)例,它也是垃圾收集器管理的主要區(qū)域。
5、方法區(qū):也是所有線程共享的一塊區(qū)域,用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
方法區(qū)中有運(yùn)行時(shí)常量池。
總結(jié):JVM的功能模塊主要包括類加載器、執(zhí)行引擎和垃圾回收系統(tǒng)。
三、類加載器加載xxx.class到內(nèi)存
虛擬機(jī)把描述類的數(shù)據(jù)從字節(jié)碼文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型。
四、虛擬機(jī)字節(jié)碼執(zhí)行引擎
執(zhí)行引擎找到main()這個(gè)入口方法,執(zhí)行其中的字節(jié)碼指令。
執(zhí)行引擎處理過程:輸入字節(jié)碼文件,進(jìn)行字節(jié)碼解析的等效過程,輸出執(zhí)行結(jié)果。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟記錄
MinIO是一個(gè)基于Apache License v2.0開源協(xié)議的對象存儲服務(wù),它兼容亞馬遜S3云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟,需要的朋友可以參考下2022-05-05Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析
這篇文章主要為大家介紹了Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn)
Ribbon是一個(gè)客戶端負(fù)載均衡器,它提供了對HTTP和TCP客戶端的行為的大量控制。這篇文章主要介紹了SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2019-01-01springBoot整合Eureka啟動(dòng)失敗的解決方案
這篇文章主要介紹了springBoot整合Eureka啟動(dòng)失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java趣味練習(xí)題之輸出兩個(gè)日期之間的相隔天數(shù)
本篇文章介紹了我看到的一個(gè)趣味小題目,怎么求得兩個(gè)日期之間相隔的天數(shù),以及解決該題目的過程及思路,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-10-10idea啟動(dòng)springboot報(bào)錯(cuò): 找不到或無法加載主類問題
這篇文章主要介紹了idea啟動(dòng)springboot報(bào)錯(cuò): 找不到或無法加載主類問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12