Java程序執(zhí)行的整個(gè)過(guò)程可以分為三個(gè)階段:編譯、加載和運(yùn)行
1.編譯
Java程序的源代碼需要經(jīng)過(guò)編譯器(例如javac)的編譯,將其轉(zhuǎn)換成字節(jié)碼(即.class文件),這個(gè)過(guò)程稱為編譯。編譯器會(huì)對(duì)源代碼中的語(yǔ)法進(jìn)行檢查和優(yōu)化,并生成可在JVM上運(yùn)行的字節(jié)碼文件。
2.類加載
當(dāng)Java程序啟動(dòng)時(shí),JVM就會(huì)創(chuàng)建一個(gè)類加載器(ClassLoader)樹來(lái)加載所有的類。類加載器負(fù)責(zé)在運(yùn)行時(shí)將類的字節(jié)碼文件加載到內(nèi)存中,并創(chuàng)建對(duì)應(yīng)的Class對(duì)象。類加載器會(huì)按照一定的順序加載類,通常是先由系統(tǒng)類加載器(AppClassLoader)加載本地路徑下的類,如果找不到則由擴(kuò)展類加載器(ExtClassLoader)加載,最后由啟動(dòng)類加載器(BootstrapClassLoader)加載JRE中的核心類。
類加載器會(huì)執(zhí)行以下三個(gè)步驟:
- 裝載:查找并加載字節(jié)碼文件;
- 鏈接:對(duì)字節(jié)碼文件進(jìn)行驗(yàn)證、準(zhǔn)備和解析;
- 初始化:對(duì)類進(jìn)行初始化,包括執(zhí)行類的static塊(如果有)和類變量的賦值。
3.執(zhí)行
在加載完成后,JVM會(huì)執(zhí)行main方法。具體執(zhí)行過(guò)程如下:
- 創(chuàng)建主線程;
- 將main方法所在類的字節(jié)碼文件裝載到JVM內(nèi)存中;
- 執(zhí)行該類的static代碼塊(如果有);
- 如果該類有父類,依次執(zhí)行其父類的static代碼塊(如果有);
- 執(zhí)行main方法。
在執(zhí)行main方法時(shí),JVM將會(huì)按照程序員編寫的語(yǔ)句依次執(zhí)行,在執(zhí)行完畢后,程序結(jié)束。
4.垃圾回收
在Java程序執(zhí)行過(guò)程中,JVM需要管理內(nèi)存,包括分配、使用和釋放內(nèi)存。當(dāng)一個(gè)對(duì)象不再被引用時(shí),JVM會(huì)通過(guò)垃圾回收機(jī)制將其回收并釋放內(nèi)存。垃圾回收器會(huì)定期掃描堆內(nèi)存中的對(duì)象,標(biāo)記不再被引用的對(duì)象為垃圾對(duì)象,然后清理掉這些對(duì)象所占用的內(nèi)存空間。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-477366.html
有關(guān)垃圾回收機(jī)制可以參考我的另一篇博客:JVM內(nèi)存回收機(jī)制_源末coco的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-477366.html
到了這里,關(guān)于Java程序執(zhí)行流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!