基础概念与常识

1. JVM与JDK与JRE

1.1 JVM

JVM是java虚拟机,是运行java字节码的虚拟机。JVM会针对不同的操作系统开发不同版本的JVM,目的是在不同操作系统上运行相同的字节码都会给出相同的结果。

同时,不同的编程语言都可以生成字节码,并运行在jvm上

1.2 JDK

jdk全称为Java Development Kit,是java开发工具包。它包含了:JRE(java runtime environment),编译器javac和其他工具。

1.3 JRE

jre是java运行已编译java程序的环境,主要包括:JVM,java基础类库。

1.4 JDK和JRE的关系

2. 字节码

2.1 定义

字节码就是java程序编译后生成的.class文件。字节码只面向JVM虚拟机。

2.2 好处

字节码只面向JVM虚拟机,不面向任何特定处理器。这样会在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。

2.3 java程序运行过程

2.4 解释器与JIT

在.class文件到机器码这一步中,JVM首先加载字节码的文件,然后通过解释器逐行解释代码,这种逐行解释的方式较慢,所以引入了JIT(just in time)编译器,JIT属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。

这里补充一下解释器和编译器的区别:

  • 编译器将字节码一次性翻译成完整的机器码
  • 解释器逐条将字节码翻译为机器码,再执行。

从.class → 机器码这一过程可以看出,java既使用了编译器,又使用了解释器,所以java是编译与解释共存的语言。

3. AOT

3.1 AOT是什么

AOT全称为ahead of time compilation,意思是在程序被执行前就将其编译成机器码,属于静态编译(类似于C++)

3.2 AOT优点

AOT 的主要优势在于启动时间、内存占用和打包体积。

  • AOT避免了JIT预热的开销,提高了java的启动速度。
  • 减少内存占用:JIT和解释器都需要用字节码,而AOT模式在程序部署前就已经编译为本地机器码,不需要解释器和JIT编译器。
  • 增强程序安全性:很难反编译。

3.3 AOT与JIT

AOT 编译无法支持 Java 的一些动态特性,如反射、动态代理。而很多框架都要用到这些动态特性,如spring。

JIT具备更高的极限处理能力(JIT可以记录很多热点代码)

4. java和C++区别

  • java中不提供指针访问内存,线程更加安全
  • java的类是单继承,C++的类可以多继承。但是java的接口可以多继承
  • java可以自动回收内存
  • C++支持方法重载和运算符重载,java只支持方法重载。