JVM系列之JVM介绍

JVM系列之JVM介绍

    • 1、为什么要学习JVM
    • 2、 JVM 定义
    • 3、JVM的作用
    • 4、查看自己的JVM
    • 5、JVM,JRE 和 JDK 联系
    • 6、往期佳文
      • 6.1、面试系列
      • 6.2、技术系列
      • 6.3、源码系列
      • 6.4、数据结构和算法系列
      • 6.5、并发系列
      • 6.6、面试题系列

1、为什么要学习JVM

       跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。
       先聊聊我的第一个观点:学习 Java 虚拟机能深入地理解 Java 这门语言。对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节。但对于工作了三年以后的朋友来说,很多时候你要解决一个问题必须深入到字节码层次去分析,你才能得到准确的结论,而字节码就是虚拟机的一部分。
       例如我们常用的布尔型 Boolean,我们都知道它有两个值,true 和 false。但你们知道其实在运行时,Java 虚拟机是没有布尔型 Boolean 这种类型的。Boolean 型在虚拟机中使用整型的 1 和 0 表示。
       例如我们都知道类路径和类名唯一确定一个类,但事实上并不是这样。或者说,我们前面说的结论只是表面上的。如果深入到虚拟机层面来说,类加载器、类路径、类名才唯一决定一个类。也就是说,如果两个不同的类加载器它们加载同一个 class 类文件,那这两个类加载器加载的类就是不同的。
       接着我想聊聊我的第二个观点:学习虚拟机是为线上排查问题打下基础。我们知道我们一个 Java 应用部署在线上机器上,肯定时不时会出现问题。除去网络、系统本身问题,很多时候 Java 应用出现问题,就是 Java 虚拟机的内存出现了问题。要么是内存溢出了,要么是 GC 频繁导致响应慢等等。
       那如何解决这些问题呢?首先,你必须学会看懂日志吧。那么你就必须要看得懂 GC 日志,这是 Java 虚拟机内容的一部分。你看懂了 GC 日志,那么你就得明白什么是年轻代、老年代、永久代、元数据区等,这些就是 Java 虚拟机的内存模型。你懂了 Java 虚拟机的内存模型,那你就得知道 Java 虚拟机是如何进行垃圾回收的,它们使用的垃圾回收算法是怎样的,它们有何优缺点。接下来就是各种垃圾回收器的特性。
       你看,这一切东西都是相关联的。你想要解决线上的 Java 应用崩溃问题,那么你就必须学会 GC 日志。要看懂 GC 日志,就必须学习 Java 虚拟机内存模型。要看懂 Java 虚拟机内存模型,你就要学会垃圾回收机制等等。


2、 JVM 定义

       JVM (Java Virtual Machine 简称 JVM),亦可称之为 Java 虚拟机。它是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,它是 Java 最具吸引力的特性之一。
JVM系列之JVM介绍_第1张图片
       虚拟机:从字面意义上来理解,虚拟机是一个虚拟化出来的计算机。
       举个例子:我们经常在 Windows 操作系统上安装 Linux 的虚拟机,然后在 Linux 虚拟机上进行 Shell 脚本的编写练习,那么从这个角度上来说, Linux 虚拟机就类似于 JVM ,不同的是 Linux 虚拟机支撑了 Shell 脚本的运行环境,而 JVM 支撑了 Java 语言的运行。
       JVM 是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM系列之JVM介绍_第2张图片
       其实 Java 虚拟机就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。


3、JVM的作用

       JVM 是 Java 语言的一大关键亮点,对于 JVM 的作用,我们这里介绍两个主要的作用,来体现 JVM 的价值所在。

  1. 跨平台性:Java 语言之所以有跨平台的优点,完全是 JVM 的功劳,跨平台性是 JVM 存在的最大的亮点。
           以上一个知识点部分所举出例子来说,Windows 操作系统安装上 JVM 之后,可以支持 Java 程序的运行; Linux 操作系统安装上 JVM 之后,可以支持 Java 程序的运行;同理,Unix 操作系统等等所有我们熟悉的操作系统,安装上 JVM 之后,都可以支持 Java 程序的运行。
  2. 优秀的垃圾回收机制: Java 语言的诞生,极大的降低了软件开发人员的学习难度,除了 Java 面向对象编程的特性能够降低学习难度以外,还有一个比较重要的点,就是在进行 Java 编程的时候,可以更少的去考虑垃圾回收机制。
           学习过 C 语言的技术人员都能够体会这一点,因为 C 语言编程过程中,要通过代码手动实现内存垃圾的回收与空间释放,这提升了编程的难度,因为考虑内存空间释放,更多的会涉及到底层的知识,这是非常高的一个门槛。从 JVM 的角度来说,JVM 拥有自己的垃圾回收机制,为开发人员分担了部分工作。

4、查看自己的JVM

java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

       最后一句执行结果,Java HotSpot™ 64-Bit Server VM (build 25.212-b10, mixed mode),这就是我的电脑中 Jvm 虚拟机操作系统的版本。


5、JVM,JRE 和 JDK 联系

       JDK:全称 java development kit ,开发工具包,面向我们的开发者,为开发者提供开发类库,他是 java 的核心。JDK 包含了JRE,一堆工具类(javac、java)以及 Java 的基础类库(Object,string);
       JRE:全称 java runtime environment。包含了JVM 实现和需要的类库。JRE 是一个运行环境,并非开发工具;
       JVM:它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 语言最重要的特点就是跨平台运行。使用 JVM 就是为了实现跨平台。
       如下图所示,我们可以看到 JDK 包含 JRE,JRE 包含 JVM,我们继续来看下边的讲解,彻底了解三者之间的联系与区别。
JVM系列之JVM介绍_第3张图片
三者的区别:
       JDK 和 JRE 的区别: JDK 是开发工具包,包含了JRE;JRE 是运行环境,不提供开发工具包。
       JRE 和 JVM 的区别: JRE 包含了JVM,JRE=JVM+lib。JRE 为 class 文件提供了运行的环境,但是需要 JVM 进行 class 文件的翻译,JVM 将翻译好的文件传给 os 系统或者是 CPU 映射指令集,才能够最终完成运行。
三者的联系:三者互相配合不可分割。
       JVM 不能够单独的搞定 class 文件,解释 class 的时候,JVM (安装路径\Java\jre1.8.0_144\bin)需要调用我们所需要的类库(安装路径\Java\jre1.8.0_144\lib)。笼统的来说,JVM + lib = JRE。而 JDK 是基于 JRE 基础之上进行的。
       总体来说,我们利用 JDK 开发了属于我们自己的程序,通过 JDK 的 javac 工具包进行了编译,将 Java 文件编译成为了 class 文件(字节码文件),在 JRE 上运行这些文件的时候,JVM 进行了这些文件(字节码文件)的翻译,翻译给操作系统,映射到 CPU 指令集或者是操作系统调用,最终完成了我们的代码程序的顺利运行。


6、往期佳文

6.1、面试系列

1、吊打面试官之一面自我介绍
2、吊打面试官之一面项目介绍
3、吊打面试官之一面系统架构设计
4、吊打面试官之一面你负责哪一块
5、吊打面试官之一面试官提问
6、吊打面试官之一面你有什么问题吗

······持续更新中······


6.2、技术系列

1、吊打面试官之分布式会话
2、吊打面试官之分布式锁
3、吊打面试官之乐观锁
4、吊打面试官之幂等性问题
5、吊打面试关之分布式事务
6、吊打面试官之项目线上问题排查

······持续更新中······

6.3、源码系列

1、源码分析之SpringBoot启动流程原理
2、源码分析之SpringBoot自动装配原理
3、源码分析之ArrayList容器
4、源码分析之LinkedList容器
5、源码分析之HashMap容器
6、源码分析之ConcurrentHashMap容器
7、源码分析之五种Map容器的区别

······持续更新中······

6.4、数据结构和算法系列

1、数据结构之八大数据结构
2、数据结构之动态查找树(二叉查找树,平衡二叉树,红黑树)

······持续更新中······

6.5、并发系列

1、并发系列之初识多线程
2、并发系列之JMM内存模型
3、并发系列之synchronized解析
4、并发系列之volatile解析
5、并发系列之synchronized与volatile的区别
6、并发系列之Lock解析
7、并发系列之synchronized与lock的区别
8、并发系列之CAS与原子操作
9、并发系列之AQS分析
10、并发系列之线程池解析
11、并发系列之锁的知识梳理

······持续更新中······

6.6、面试题系列

1、面试题系列之并发面试题

······持续更新中······


你可能感兴趣的:(JVM系列,jvm,java,面试)