面试知识点整理,持续更新

# 面试知识点整理,持续更新

## 1  Java基础

### JVM  JDK  JRE

#### JVM

​        Java虚拟机(JVM)是运行Java字节码的虚拟机.JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,他们都会给出相同的结果.字节码和不同系统的JVM实现Java语言"一次编译,随处可以运行"的关键所在.

​        **JVM并不是只有一种!只要满足JVM规范,每个公司,组织或者个人都可以开发自己的JVM.**也就是说我们平时接触到的HotSpot VM仅仅是JVM规范的一种.

​        除了我们平时最常⽤的 HotSpot VM 外,还有 J9 VM、Zing VM、JRockit VM 等 JVM 。维基百科上 就有常⻅ JVM 的对⽐:Comparison of Java virtual machines ,感兴趣的可以去看看。并且,你可 以在 Java SE Specifications 上找到各个版本的 JDK 对应的 JVM 规范。

![image-20220927141938923](https://baishui-1257832749.cos.ap-chengdu.myqcloud.com/image-20220927141938923.png)

#### JDK和JRE

​        JDK 是 Java Development Kit 缩写,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有 编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。

​         **JRE 是 Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机 (JVM),Java 类库,java 命令和其他的⼀些基础构件。**但是,它不能⽤于创建新程序。

​         如果你只是为了运⾏⼀下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进⾏⼀些 Java 编程⽅⾯的⼯作,那么你就需要安装 JDK 了。但是,这不是绝对的。有时,即使您不打算在计 算机上进⾏任何 Java 开发,仍然需要安装 JDK。例如,如果要使⽤ JSP 部署 Web 应⽤程序,那么 从技术上讲,您只是在应⽤程序服务器中运⾏ Java 程序。那你为什么需要 JDK 呢?因为应⽤程序 服务器会将 JSP 转换为 Java servlet,并且需要使⽤ JDK 来编译 servlet.

### 什么是字节码?采用字节码的好处是什么?

​        在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的⽂件),它不⾯向任何特定 的处理器,只⾯向虚拟机。Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏ 效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以, Java 程序运⾏时相对来说还是⾼效 的(不过,和 C++,Rust,Go 等语⾔还是有⼀定差距的),⽽且,由于字节码并不针对⼀种特定的 机器,因此,Java 程序⽆须重新编译便可在多种不同操作系统的计算机上运⾏。

**Java 程序从源代码到运⾏的过程如下所示:**

```
.java--->javac编译--->.class--->解释器&JIT--->机器可理解的代码--->[[计算机]]
```

我们需要格外注意的是 .class->机器码 这⼀步。在这⼀步 JVM 类加载器⾸先加载字节码⽂件,然后 通过解释器逐⾏解释执⾏,这种⽅式的执⾏速度会相对⽐᫾慢。⽽且,有些⽅法和代码块是经常需要 被调⽤的(也就是所谓的热点代码),所以后⾯引进了 JIT(just-in-time compilation) 编译器,⽽ JIT 属于运⾏时编译。当 JIT 编译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以 直接使⽤。⽽我们知道,机器码的运⾏效率肯定是⾼于 Java 解释器的。这也解释了我们为什么经常 会说 **Java 是编译与解释共存的语⾔** .

> HotSpot 采⽤了惰性评估(Lazy Evaluation)的做法,根据⼆⼋定律,消耗⼤部分系统资源的只有 那⼀⼩部分的代码(热点代码),⽽这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被 执⾏的情况收集信息并相应地做出⼀些优化,因此执⾏的次数越多,它的速度就越快。JDK 9 引⼊了⼀种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器 码,这样就避免了 JIT 预热等各⽅⾯的开销。JDK ⽀持分层编译和 AOT 协作使⽤

### 为什么不全部使⽤ AOT 呢?

​        AOT 可以提前编译节省启动时间,那为什么不全部使⽤这种编译⽅式呢? 

​        ⻓话短说,这和 Java 语⾔的动态特性有千丝万缕的联系了。举个例⼦,CGLIB 动态代理使⽤的是 ASM 技术,⽽这种技术⼤致原理是运⾏时直接在内存中⽣成并加载修改后的字节码⽂件也就是 .class ⽂件,如果全部使⽤ AOT 提前编译,也就不能使⽤ ASM 技术了。为了⽀持类似的动态特 性,所以选择使⽤ JIT 即时编译器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值