流程
-
编译源代码: 使用Java编译器(例如
javac
),这些.java
文件被编译成Java字节码。字节码是一种中间形式的代码,保存在扩展名为.class
的文件中。这个步骤不涉及JVM。 -
加载字节码: 当运行Java程序时,Java虚拟机(JVM)首先加载相应的
.class
文件。JVM的类加载器负责这个过程。 -
解释/编译字节码: JVM可以以两种方式执行字节码:
具体介绍
编译源代码
-
源代码到字节码: Java编译器(如
javac
)将Java源代码(.java
文件)转换为Java字节码。这个转换过程涉及多个步骤,如语法分析、语义分析、生成中间表示、优化和最终生成字节码。 -
生成字节码: 经过优化后,编译器将这种中间表示转换为字节码,这是一种与平台无关的低级代码,保存在
.class
文件中。字节码既不是完全的机器代码,也不是高级语言代码,它专为JVM设计,易于跨平台移植和执行。
加载字节码
-
类加载: 当Java程序运行时,JVM通过其类加载器加载
.class
文件。类加载器按需加载类文件,即在程序中首次引用类时加载该类。 -
类加载器的层级: JVM使用分层的类加载器,包括引导类加载器(加载Java核心库)、扩展类加载器(加载扩展库)和应用程序类加载器(加载应用程序的类)。这种层级结构有助于安全和模块化。
字节码验证
-
验证过程: 当类被加载到JVM时,内部的验证器会对字节码进行检查。验证确保字节码遵守Java语言规范,不会对JVM造成安全风险。
-
安全和健全性检查: 验证过程包括检查字节码的结构完整性、数据类型的正确性、操作码的合法性等。这确保了程序在运行时不会访问非法内存、执行非法操作或破坏JVM的内部结构。
-
执行环境的准备: 验证器还确保类的结构符合执行环境的要求,比如类的方法解析、字段解析等。
解释/编译字节码
-
解释执行: JVM的解释器以一种边解释边执行的方式运行字节码。这意味着每次运行程序时,字节码都会被解释为机器码。这个过程虽然灵活,但执行速度相对较慢。
-
即时编译(JIT编译): JIT编译器在程序运行时动态地将字节码编译成机器码。它通常会针对频繁执行的代码路径(热点代码)进行编译优化,以提高执行效率。JIT编译可以显著提高程序运行速度,但会增加一定的编译开销。
执行程序
-
运行机器码: 不论是解释执行还是JIT编译,最终字节码都会被转换成特定平台的机器码,由CPU执行。
-
动态链接: 在运行时,JVM还会处理类和方法的动态链接,即在运行时解析类和方法的引用。
运行时环境
-
异常处理: JVM还负责处理运行时异常和错误,提供了一套异常处理机制来处理程序执行中的异常情况。
原文地址:https://blog.csdn.net/qq_65052774/article/details/134656264
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_536.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!