简单了解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中的BufferedInputStream与BufferedOutputStream使用示例
BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:2016-06-06深入了解Maven Settings.xml文件的结构和功能
这篇文章主要为大家介绍了Maven Settings.xml文件基本结构和功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11mybatis @InsertProvider报错问题及解决
这篇文章主要介绍了mybatis @InsertProvider报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-07-07Java日期工具类操作字符串Date和LocalDate互转
这篇文章主要介绍了Java日期工具类操作字符串Date和LocalDate互转,文章首先通过需要先引入坐标展开主题的相关内容介绍,需要的朋友可以参一下2022-06-06Java8 自定义CompletableFuture的原理解析
这篇文章主要介绍了Java8 自定义CompletableFuture的原理解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
最新评论