java代码执行流程

来源:互联网 发布:扫描线填充算法 编辑:程序博客网 时间:2024/06/07 20:13

         计算机分为运算器,控制器,存储器,输入设备和输出设备五个部分.

    CPU包括运算器和控制器;存储器包括cache,内存和外存(硬盘).

         各个部件由总线连接,包括地址总线,数据总线,控制总线.

         整体的执行流程如下:

        (1)  上电,由晶振电路产生时序电路,作为计算机的脉搏,此后,每个时序边沿到来,都会驱动数字电路进行运算.

        (2)  点击Rst,系统复位,在时序电路的触发边沿,将一个地址放到程序计数器,这个地址就是主板bios中的固定程序的首地址

        (3)  cpu将bios程序的第一行放入到指令寄存器,开始执行代码,

        (4)  bios完成系统初始化,并加载系统的bootloader到内存,执行完毕后,跳转到bootloader开始执行

        (5)  bootloader做一系列初始化,将OS调入,开始执行操作系统代码.

         指令代码执行流程:

      

     再来研究一下java代码的执行流程,先写一个测试类:

package com.pulma.test.codepactice;public class Main {    public static void main(String[] args) {        compute();    }        public static void compute() {        int a = 1;        int b = 2;        int c = a + b;        System.out.println(c);    }}

    将代码反编译成字节码:

Compiled from "Main.java"public class com.pulma.test.codepactice.Main extends java.lang.Object  SourceFile: "Main.java"  minor version: 0  major version: 50  Constant pool:const #1 = Method       #6.#16; //  java/lang/Object."<init>":()Vconst #2 = Method       #5.#17; //  com/pulma/test/codepactice/Main.compute:()Vconst #3 = Field        #18.#19;        //  java/lang/System.out:Ljava/io/PrintStream;const #4 = Method       #20.#21;        //  java/io/PrintStream.println:(I)Vconst #5 = class        #22;    //  com/pulma/test/codepactice/Mainconst #6 = class        #23;    //  java/lang/Objectconst #7 = Asciz        <init>;const #8 = Asciz        ()V;const #9 = Asciz        Code;const #10 = Asciz       LineNumberTable;const #11 = Asciz       main;const #12 = Asciz       ([Ljava/lang/String;)V;const #13 = Asciz       compute;const #14 = Asciz       SourceFile;const #15 = Asciz       Main.java;const #16 = NameAndType #7:#8;//  "<init>":()Vconst #17 = NameAndType #13:#8;//  compute:()Vconst #18 = class       #24;    //  java/lang/Systemconst #19 = NameAndType #25:#26;//  out:Ljava/io/PrintStream;const #20 = class       #27;    //  java/io/PrintStreamconst #21 = NameAndType #28:#29;//  println:(I)Vconst #22 = Asciz       com/pulma/test/codepactice/Main;const #23 = Asciz       java/lang/Object;const #24 = Asciz       java/lang/System;const #25 = Asciz       out;const #26 = Asciz       Ljava/io/PrintStream;;const #27 = Asciz       java/io/PrintStream;const #28 = Asciz       println;const #29 = Asciz       (I)V;{public com.pulma.test.codepactice.Main();  Code:   Stack=1, Locals=1, Args_size=1   0:   aload_0   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V   4:   return  LineNumberTable:   line 3: 0public static void main(java.lang.String[]);  Code:   Stack=0, Locals=1, Args_size=1   0:   invokestatic    #2; //Method compute:()V   3:   return  LineNumberTable:   line 6: 0   line 7: 3public static void compute();  Code:   Stack=2, Locals=3, Args_size=0   0:   iconst_1   1:   istore_0   2:   iconst_2   3:   istore_1   4:   iload_0   5:   iload_1   6:   iadd   7:   istore_2   8:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;   11:  iload_2   12:  invokevirtual   #4; //Method java/io/PrintStream.println:(I)V   15:  return  LineNumberTable:   line 10: 0   line 11: 2   line 12: 4   line 13: 8   line 14: 15}

每个平台有不同的JVM实现,例如,在X86平台,JVM就需要将iadd等字节码指令翻译成cpu可以识别的指令,然后按照前述的指令执行步骤,进行执行,就可以实现代码的运行了.

      

附:java框架师之路相关资料    


1 0
原创粉丝点击