简单了解Java程序运行整体流程

 更新时间:2020年07月03日 16:03:41   作者:Tim_Bergling  
这篇文章主要介绍了简单了解Java程序运行整体流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

概述

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

  • 源文件 编译器编译> 字节码文件(ByteCode)。
  • 字节码文件 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类的运行过程:

  • 类的加载
  • 类的执行

注:

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

详细步骤:

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

注:

  • public和protected的实例方法采用动态绑定机制:要用到方法表。
  • private,static,构造器和初始化方法采用静态绑定机制:不需要方法表。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

    Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java中ArrayList和LinkedList之间的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Mybatis-plus动态条件查询QueryWrapper的使用案例

    Mybatis-plus动态条件查询QueryWrapper的使用案例

    mybatis-plus框架功能很强大,把很多功能都集成了,下面这篇文章主要给大家介绍了关于Mybatis-plus动态条件查询QueryWrapper的使用教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Springboot Druid 自定义加密数据库密码的几种方案

    Springboot Druid 自定义加密数据库密码的几种方案

    这篇文章主要介绍了Springboot Druid 自定义加密数据库密码的步骤,帮助大家更好的理解和使用springboot,感兴趣的朋友可以了解下
    2020-12-12
  • Spring容器刷新prepareRefresh第一步

    Spring容器刷新prepareRefresh第一步

    这篇文章主要为大家介绍了Spring容器刷新prepareRefresh第一步示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Struts2的输入校验实例代码

    Struts2的输入校验实例代码

    这篇文章主要介绍了Struts2的输入校验实例代码,非常不错,具有参考借鉴价值, 需要的朋友可以参考下
    2017-03-03
  • 如何避免在Java项目里大批量使用if-else?

    如何避免在Java项目里大批量使用if-else?

    想起刚开始接触JAVA时,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭.等到编程能力渐渐提升之后,再回过头去看曾经写过的满屏if-else时,感觉全都是翔.....,需要的朋友可以参考下
    2021-06-06
  • Java之SpringBoot集成ActiveMQ消息中间件案例讲解

    Java之SpringBoot集成ActiveMQ消息中间件案例讲解

    这篇文章主要介绍了Java之SpringBoot集成ActiveMQ消息中间件案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Servlet简单实现登录功能

    Servlet简单实现登录功能

    这篇文章主要为大家详细介绍了Servlet简单实现登录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • MyBatis 详细讲解动态 SQL的使用

    MyBatis 详细讲解动态 SQL的使用

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
    2022-04-04
  • Springmvc国际化自动配置代码实现

    Springmvc国际化自动配置代码实现

    这篇文章主要介绍了Springmvc国际化自动配置代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论