欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java程序執(zhí)行的全流程

 更新時(shí)間:2024年01月29日 09:06:42   作者:源末coco  
這篇文章主要介紹了Java程序執(zhí)行的全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java程序執(zhí)行流程

Java程序執(zhí)行的整個(gè)過(guò)程可以分為三個(gè)階段:編譯、加載和運(yùn)行

1.編譯

Java程序的源代碼需要經(jīng)過(guò)編譯器(例如javac)的編譯,將其轉(zhuǎn)換成字節(jié)碼(即.class文件),這個(gè)過(guò)程稱(chēng)為編譯。

編譯器會(huì)對(duì)源代碼中的語(yǔ)法進(jìn)行檢查和優(yōu)化,并生成可在JVM上運(yùn)行的字節(jié)碼文件。

2.類(lèi)加載

當(dāng)Java程序啟動(dòng)時(shí),JVM就會(huì)創(chuàng)建一個(gè)類(lèi)加載器(ClassLoader)樹(shù)來(lái)加載所有的類(lèi)。

類(lèi)加載器負(fù)責(zé)在運(yùn)行時(shí)將類(lèi)的字節(jié)碼文件加載到內(nèi)存中,并創(chuàng)建對(duì)應(yīng)的Class對(duì)象。

類(lèi)加載器會(huì)按照一定的順序加載類(lèi),通常是先由系統(tǒng)類(lèi)加載器(AppClassLoader)加載本地路徑下的類(lèi),如果找不到則由擴(kuò)展類(lèi)加載器(ExtClassLoader)加載,最后由啟動(dòng)類(lèi)加載器(BootstrapClassLoader)加載JRE中的核心類(lèi)。

類(lèi)加載器會(huì)執(zhí)行以下三個(gè)步驟:

  • 裝載:查找并加載字節(jié)碼文件;
  • 鏈接:對(duì)字節(jié)碼文件進(jìn)行驗(yàn)證、準(zhǔn)備和解析;
  • 初始化:對(duì)類(lèi)進(jìn)行初始化,包括執(zhí)行類(lèi)的static塊(如果有)和類(lèi)變量的賦值。

3.執(zhí)行

在加載完成后,JVM會(huì)執(zhí)行main方法。具體執(zhí)行過(guò)程如下:

  • 創(chuàng)建主線程;
  • 將main方法所在類(lèi)的字節(jié)碼文件裝載到JVM內(nèi)存中;
  • 執(zhí)行該類(lèi)的static代碼塊(如果有);
  • 如果該類(lèi)有父類(lèi),依次執(zhí)行其父類(lèi)的static代碼塊(如果有);
  • 執(zhí)行main方法。

在執(zhí)行main方法時(shí),JVM將會(huì)按照程序員編寫(xiě)的語(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)存空間。

Java代碼執(zhí)行Linux命令

說(shuō)明:項(xiàng)目必須是部署在Linux服務(wù)器中才能生效。

1.工具類(lèi)

@Controller
public class ExecuteNewFlowUtil {
    /**
     * 運(yùn)行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");// 這個(gè)命令必須執(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í)行代碼段

//運(yùn)行命令生成對(duì)比信息
List<String> generateComparativeInformationCommands = new ArrayList<>();
generateComparativeInformationCommands.add("命令1");
generateComparativeInformationCommands.add("命令2");
generateComparativeInformationCommands.add("命令3");
executeNewFlowUtil.executeNewFlow(generateComparativeInformationCommands);

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot引入druid解析sql的過(guò)程

    springboot引入druid解析sql的過(guò)程

    在開(kāi)發(fā)中,有時(shí)我們可能會(huì)需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類(lèi)型SQL會(huì)存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類(lèi)型的sql解析,需要的朋友可以參考下
    2023-08-08
  • SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Java中設(shè)置session超時(shí)(失效)的三種方法

    Java中設(shè)置session超時(shí)(失效)的三種方法

    這篇文章主要介紹了Java中設(shè)置session超時(shí)(失效)的三種方法,本文講解了在web容器中設(shè)置、在工程的web.xml中設(shè)置、通過(guò)java代碼設(shè)置3種方法,需要的朋友可以參考下
    2015-07-07
  • 配置JAVA環(huán)境變量中CLASSPATH變量的作用

    配置JAVA環(huán)境變量中CLASSPATH變量的作用

    這篇文章主要介紹了配置JAVA環(huán)境變量中CLASSPATH變量的作用,需要的朋友可以參考下
    2023-06-06
  • 詳解利用Spring加載Properties配置文件

    詳解利用Spring加載Properties配置文件

    本篇文章主要介紹了詳解利用Spring加載Properties配置文件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java基礎(chǔ)篇之反射機(jī)制詳解

    Java基礎(chǔ)篇之反射機(jī)制詳解

    本文詳細(xì)講解了Java基礎(chǔ)篇之反射機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • IDEA讓包分層顯示的實(shí)現(xiàn)方式

    IDEA讓包分層顯示的實(shí)現(xiàn)方式

    這篇文章主要介紹了IDEA讓包分層顯示的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java的三種隨機(jī)數(shù)生成方式

    java的三種隨機(jī)數(shù)生成方式

    主要介紹了java的三種隨機(jī)數(shù)生成方式的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2021-07-07
  • 一文搞懂Java創(chuàng)建線程的五種方法

    一文搞懂Java創(chuàng)建線程的五種方法

    本文主要為大家詳細(xì)介紹一下Java實(shí)現(xiàn)線程創(chuàng)建的五種常見(jiàn)方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-06-06
  • java.lang.NullPointerException異常的幾種原因及解決方案

    java.lang.NullPointerException異常的幾種原因及解決方案

    本文主要介紹了java.lang.NullPointerException異常的幾種原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論