• Java程序运行的整体流程


    Java程序运行的整体流程


    概述

    Java程序从创建源文件程序运行要经历两个主要步骤:

    1. 源文件 编译器编译> 字节码文件(ByteCode)。
    2. 字节码文件 JVM解释运行> 在内存中运行

    Java程序从编译到运行

    示例程序:

    public class ClassA{
        public static void main(String[] args){
            ClassB b = new ClassB("b");
            b.method();
        }
    }
    
    class ClassB{
        private String name;
        public ClassB(String name){
            this.name = name;
        }
        
        public void method(){
            System.out.println("ClassB method()");
        }
    
    }
    

    编译

    • 源文件被编译成.class文件。
    • 若一个类所依赖的类还没有编译,则先编译被依赖的类,然后引用。
    • 若已编译,则直接引用。
    • 若找不到指定类的文件,则抛出cannot find symbol错误。
    • 编译后生成的字节码文件由两部分组成:
      • 常量池:代码中的所有token(类名,成员变量名)和符号引用(方法引用,成员变量引用)
      • 方法字节码:类中各个方法的字节码。

    运行

    Java类的运行过程:

    1. 类的加载
    2. 类的执行

    注:
    JVM在程序第一次主动使用类的时候才加载类,而不是一开始将所有的类都加载到内存中,只加载一次。

    详细步骤:

    1. 系统启动一个JVM进程,JVM从classpath路径中查找对应的字节码文件,将对应的类信息加载到运行时数据区的方法区内(类的加载)。
    2. JVM找到类的主函数入口,执行main函数。
    3. 若需创建对象,而方法区没有该类的信息,则加载对应的类,并把类信息放入方法区。
    4. 加载所需的类后,JVM在堆区中为实例对象分配内存,并调用构造函数初始化实例。(该实例有指向方法区对应类的类信息的引用)
    5. 当调用实例的方法时,JVM由对象引用找到堆中的对象,再由对象持有的引用定位到方法区中类的类型信息的方法表,从而获得待调用函数的字节码的地址。
    6. 开始执行调用的函数。

    注:

    • publicprotected的实例方法采用动态绑定机制:要用到方法表。
    • private,static,构造器和初始化方法采用静态绑定机制:不需要方法表。
  • 相关阅读:
    对Linux内核中进程上下文和中断上下文的理解
    深入浅出进程与线程的基本概念
    真正明白c语言二级指针
    寄存器变量
    python类中初始化为可变对象的属性,在多次对类实例化时数据会堆叠
    python中使用uwsgi启动wsgi应用
    火狐新版移除developer Toolbar和无法关闭自动更新的解决
    hive中计算某个日期是星期几的算法
    计算两个日期之间的天数(去掉周六周日)
    hive动态分区常用参数
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13217279.html
Copyright © 2020-2023  润新知