Java程序執(zhí)行的全流程
Java程序執(zhí)行流程
Java程序執(zhí)行的整個過程可以分為三個階段:編譯、加載和運行
1.編譯
Java程序的源代碼需要經(jīng)過編譯器(例如javac)的編譯,將其轉(zhuǎn)換成字節(jié)碼(即.class文件),這個過程稱為編譯。
編譯器會對源代碼中的語法進行檢查和優(yōu)化,并生成可在JVM上運行的字節(jié)碼文件。
2.類加載
當(dāng)Java程序啟動時,JVM就會創(chuàng)建一個類加載器(ClassLoader)樹來加載所有的類。
類加載器負責(zé)在運行時將類的字節(jié)碼文件加載到內(nèi)存中,并創(chuàng)建對應(yīng)的Class對象。
類加載器會按照一定的順序加載類,通常是先由系統(tǒng)類加載器(AppClassLoader)加載本地路徑下的類,如果找不到則由擴展類加載器(ExtClassLoader)加載,最后由啟動類加載器(BootstrapClassLoader)加載JRE中的核心類。
類加載器會執(zhí)行以下三個步驟:
- 裝載:查找并加載字節(jié)碼文件;
- 鏈接:對字節(jié)碼文件進行驗證、準備和解析;
- 初始化:對類進行初始化,包括執(zhí)行類的static塊(如果有)和類變量的賦值。
3.執(zhí)行
在加載完成后,JVM會執(zhí)行main方法。具體執(zhí)行過程如下:
- 創(chuàng)建主線程;
- 將main方法所在類的字節(jié)碼文件裝載到JVM內(nèi)存中;
- 執(zhí)行該類的static代碼塊(如果有);
- 如果該類有父類,依次執(zhí)行其父類的static代碼塊(如果有);
- 執(zhí)行main方法。
在執(zhí)行main方法時,JVM將會按照程序員編寫的語句依次執(zhí)行,在執(zhí)行完畢后,程序結(jié)束。
4.垃圾回收
在Java程序執(zhí)行過程中,JVM需要管理內(nèi)存,包括分配、使用和釋放內(nèi)存。
當(dāng)一個對象不再被引用時,JVM會通過垃圾回收機制將其回收并釋放內(nèi)存。
垃圾回收器會定期掃描堆內(nèi)存中的對象,標(biāo)記不再被引用的對象為垃圾對象,然后清理掉這些對象所占用的內(nèi)存空間。
Java代碼執(zhí)行Linux命令
說明:項目必須是部署在Linux服務(wù)器中才能生效。
1.工具類
@Controller
public class ExecuteNewFlowUtil {
/**
* 運行Linux命令
* @author YuanRiKang
* @date 2022/5/24 16:56
* @param commands 命令集合
* @return 返回結(jié)果
*/
public List<String> executeNewFlow(List<String> commands) {
List<String> rspList = new ArrayList<String>();
Runtime run = Runtime.getRuntime();
try {
Process proc = run.exec("/bin/bash", null, null);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
for (String line : commands) {
out.println(line);
}
out.println("exit");// 這個命令必須執(zhí)行,否則in流不結(jié)束。
String rspLine = "";
while ((rspLine = in.readLine()) != null) {
System.out.println(rspLine);
rspList.add(rspLine);
}
proc.waitFor();
in.close();
out.close();
proc.destroy();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return rspList;
}
}2.方法執(zhí)行代碼段
//運行命令生成對比信息
List<String> generateComparativeInformationCommands = new ArrayList<>();
generateComparativeInformationCommands.add("命令1");
generateComparativeInformationCommands.add("命令2");
generateComparativeInformationCommands.add("命令3");
executeNewFlowUtil.executeNewFlow(generateComparativeInformationCommands);總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成screw實現(xiàn)數(shù)據(jù)庫文檔生成的代碼示例
數(shù)據(jù)庫設(shè)計文檔是項目技術(shù)文檔的重要組成部分,Screw 是一款開源的數(shù)據(jù)庫文檔生成工具,它支持多種數(shù)據(jù)庫類型,并能生成豐富格式的文檔,本文將通過一個實際的例子,展示如何使用 Spring Boot 集成 Screw 生成數(shù)據(jù)庫設(shè)計文檔2024-07-07
集合框架及背后的數(shù)據(jù)結(jié)構(gòu)
本文主要介紹了Java的集合框架Java?Collection?Framework,接口interface以及背后的數(shù)據(jù)結(jié)構(gòu),感興趣的同學(xué)可以閱讀參考2023-03-03
Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
這篇文章主要介紹了Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu),文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04

