JAVA程序运行流程

本文详细介绍了Java程序的运行流程,包括使用javac编译源文件为字节码,JVM如何加载、连接及运行这些字节码。在连接阶段,涉及验证、准备和解析等步骤,确保程序安全并准备执行。最后,字节码由运行时解释器解释为机器码执行,而即时编译器则会针对热点代码进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java程序运行

类加载

1.使用javac将后缀.java的源文件编译成.class字节码文件

2.JVM加载字节码(也称为类加载)

  • 从表面上看,.class文件通过加载,生成某种形式的Class数据结构进入内存,也称为反射,程序可以调用这个数据结构,创建Object
  • 从上图中可以看到类加载只包括加载,连接,初始化三个过程
  • 解析部分是灵活的,他可以在初始化环节之后再进行,实现所谓的后期绑定,其他环节的顺序不可改变

2.1加载

加载时一个读取Class文件(这里的Class文件不仅仅指的是本地的二进制文件,泛指各种二进制流),将其转化为某种静态数据结构存储在方法区内,并在中生成一个便于用户调用的java.lang.Class类型的对象的过程

2.2连接

2.2.1验证
  • 文件格式验证
  • 元数据、字节码的验证,保证其不会产生危害虚拟机的行为
  • 符号引用验证
2.2.2准备
  • 为该类型中定义的静态变量赋0值

虚拟机内存规范中定义了方法区这种抽象概念,HotSpot在JDK8之前使用永久代这种具体的实现方式来实现方法区,JDK8之后取消永久代,采用元空间这种直接内存来替代。方法区是抽象概念,是JVM规范的定义,永久代和元空间是实现方式,JDK8之后,常量池和静态变量转到堆中,类的元信息还是存放在方法区内。

2.2.3 解析
  • 符号引用替换为直接引用

3.运行

  • 运行时解释器将字节码解释为一行行机器码来执行
  • 在程序运行期间,即时编译器会针对热点代码,将该部分字节码编译成机器码,以获取更高的执行效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值