<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          核桃干貨 | Java9新特性有哪些新特性?

          共 2081字,需瀏覽 5分鐘

           ·

          2021-03-11 00:52



          一、前言


          本文的主要工作:嘗試以時間順序追蹤一遍 Java 執(zhí)行的整個過程,以及展示 JVM 中內(nèi)存模型的相應(yīng)變化。

          本文的主要目的:希望能夠通過 Java 執(zhí)行過程的冰山一角,增進對編程語言工作原理的理解。

          以下面這段代碼為例,追蹤它的執(zhí)行過程:

          public class Car {
              private int speed;

              public void setSpeed(int speed) {
                  this.speed = speed;
              }

              public void getSpeed() {
                  System.out.println(speed);
              }

              public static void main(String[] args) {
                  Car car = new Car();
                  car.setSpeed(3);
                  car.getSpeed();
              }
          }


          二、執(zhí)行過程


          接下來是具體的執(zhí)行過程,總共包含五個步驟:編譯、加載、執(zhí)行 main 方法、執(zhí)行成員方法、方法返回。


          Step1:編譯


          首先,在我們完成上述這段源碼之后,要想讓程序跑起來,我們需要將其編譯成為字節(jié)碼文件。字節(jié)碼是一種跨平臺的JVM機器語言,它能夠被JVM所解析,而無關(guān)底層的操作系統(tǒng)。


          Step2:加載


          當(dāng)代碼需要被調(diào)用時,JVM 會加載目標字節(jié)碼至方法區(qū),并轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu),這里的加載過程是通過類加載器完成的。然后內(nèi)存中(不一定是堆)會生成一個代表這個類的 java.lang.Class 對象,作為方法區(qū)這個類的各種數(shù)據(jù)結(jié)構(gòu)的訪問入口。



          Step3:執(zhí)行 main 方法

          main 方法可以通過 java.lang.Class 對象進行調(diào)用,參考如下代碼:

          Method method = targetClass.getDeclareMethod("main", String[].class);
          method.invoke(null, (Object) new String[0]);


          之后 PC 寄存器將會指向方法區(qū)中的 main 函數(shù)地址,線程棧中會生成對應(yīng)的棧楨,其主要用于存放當(dāng)前方法的局部變量表、操作棧、以及方法返回地址。接下來,PC 寄存器向后地址偏移,執(zhí)行引擎開始執(zhí)行 main 方法體。當(dāng)語句 Car car = new Car() 執(zhí)行完畢,棧楨與堆中的相應(yīng)變化如下:



          Step4:執(zhí)行成員方法

          對象 car 的 setSpeed 方法調(diào)用過程和 main 類似,通過索引 car 的成員方法地址,PC寄存器將指向方法區(qū)中的 setSpeed 函數(shù)地址,同時線程棧中將產(chǎn)生新的棧楨,其中的方法返回地址用于保存原有 PC 地址偏移。當(dāng)賦值語句 this.speed = speed 執(zhí)行完畢,棧楨與堆中發(fā)生的相應(yīng)變化如下:


          Step5:方法返回

          隨著 setSpeed 方法的執(zhí)行結(jié)束,Stack 中的相應(yīng)棧楨出棧,棧頂指針重新指向 main 棧楨。同時 PC 寄存器將根據(jù)方法返回地址進行還原,從而繼續(xù)執(zhí)行 main 的方法體。當(dāng) main 方法也執(zhí)行完畢出棧后,主線程與虛擬機實例銷亡,程序結(jié)束。

          三、雜談


          虛擬機或某一門程序語言,作為一種底層實現(xiàn),可以滿足上層用戶的絕大部分需求,但是需求是與時俱進的,總有一天用戶需要編寫自己的底層實現(xiàn),比如組件、框架、一門新語言。這時需要打開原有的規(guī)范,先破壞它,再重建它,從而定義自己的規(guī)范。這也許是我們需要探究底層的緣由之一吧。




          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色视频网站一级片 | 五月天社区 | 四虎永久在线精品无码 | 无码视屏| 综合一和综合二图片小说 |