Java基础之何为Java
更新: 5/9/2025 字数: 0 字 时长: 0 分钟
JDK是什么
Java开发工具包包含了 JRE(Java Runtime Environment),以及编译器 javac 和其他工具。
JRE是什么
JRE(Java Runtime Environment)——Java运行环境,包含JVM与一些基础的库。
从 JDK 9 开始,就不需要区分 JDK 和 JRE 的关系了,取而代之的是模块系统(JDK 被重新组织成 94 个模块)+ jlink 工具 (随 Java 9 一起发布的新命令行工具,用于生成自定义 Java 运行时映像,该映像仅包含给定应用程序所需的模块) 。并且,从 JDK 11 开始,Oracle 不再提供单独的 JRE 下载。
JVM是什么
Java最初的理念是一次编译,随处可以运行,因而Java希望寻求一种可以不考虑芯片和操作系统就能运行代码的方式。
最后Java提供的解决方案就是JVM(Java Virtual Machine,Java虚拟机),JVM根据不同系统做出不同实现,通过接受相同的字节码跟据不同平台得到可以运行的结果。
字节码是什么
JVM可以理解的代码即为字节码(.class文件),不面向芯片,仅面向虚拟机。通过使用字节码+JVM的方式Java实现了多平台。
Java会将代码转化为字节码,接着使用惰性评估的方式将代码分为消耗大部分资源的热点代码和其他代码,热点代码使用JIT编译器编译,其他代码使用解释器直接进行解释执行。
JIT是什么
JIT(Just in Time Compilation,即时编译)
直接将字节码使用解释器解释执行的过程较慢,因此我们选择部分代码(热点代码)使用即使编译。
JIT(Just in Time Compilation) 编译器通过运行时编译的方式将热点代码转换为机械码,JIT会将机械码保存下来以供下一次直接使用。
JVM会根据代码执行情况进行优化,因此运行次数越多,他的速度越快。
总结:Java如何实现编译与解释并存
- 编译型语言指通过编译器将源代码一次性翻译成可被该平台执行的机器码,该类语言执行速度快(对于一个函数的多次调用不需要多次转化未机械码)但开发效率低(编译耗时长),代表语言有C,C++,Rust,Go
- 解释型语言指通过解释器一句一句的将代码解释为机器代码后再执行,该类语言解释型语言开发效率比较快,执行速度比较慢,代表语言有js
而Java在此以外引入了字节码(为了给JVM使用进而实现跨平台),完成从源码——>字节码——>机械码这一过程。
源码——>字节码这一过程实现了优化(转换出的字节码比源码更容易转化为机械码),因此速度会比一般的解释型语言快一些,但速度还是明显不如C++这类语言。
为解决这一问题Java引入JIT,JVM中会设置一个阈值,当方法或者代码块的在一定时间内的调用次数超过这个阈值时就会被编译,存入codeCache中(这一过程即是对热点代码的处理,是类编译型)。
而非热点代码,Java这使用解释器解释字节码,这一过程类解释型。
因此我们会说Java是编译与解释并存的语言。
什么是AOT
AOT(Ahead of Time Compilation,运行前编译)
AOT于JDK9引入,会在程序执行前将程序转换为机械码,这种方式为静态编译(即C++,Rust,Go使用的编译方式),避免了JIT的预热消耗的时间,提高了Java程序的启动速度,提高了安全性(不容易被反编译和修改)。
为什么不全面使用AOT取代JIT
这个问题其实显而易见,阅读了刚才的内容我们很容易就发现,由于使用了静态编译,我们无法使用Java的动态特性(如反射,动态代理,动态加载)。而很多框架都是基于Java的动态特性实现的(如Spring),因此我们不会全面使用AOT。