java代码执行流程

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

    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>":()V
const #2 = Method       #5.#17; //  com/pulma/test/codepactice/Main.compute:()V
const #3 = Field        #18.#19;        //  java/lang/System.out:Ljava/io/PrintS
tream;
const #4 = Method       #20.#21;        //  java/io/PrintStream.println:(I)V
const #5 = class        #22;    //  com/pulma/test/codepactice/Main
const #6 = class        #23;    //  java/lang/Object
const #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>":()V
const #17 = NameAndType #13:#8;//  compute:()V
const #18 = class       #24;    //  java/lang/System
const #19 = NameAndType #25:#26;//  out:Ljava/io/PrintStream;
const #20 = class       #27;    //  java/io/PrintStream
const #21 = NameAndType #28:#29;//  println:(I)V
const #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: 0


public 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: 3


public 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框架师之路相关资料    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值