JVM 介绍

1. 前言

本节内容主要是介绍 JVM 的定义、意义以及虚拟机的发展历程,是本套课程的基础知识部分,也是我们初次握手JVM 的章节。本节主要知识点如下:

  • 了解 JVM 的定义,这是我们了解 JVM 概念的基础,为本节的重点之一;

  • 了解 JVM 存在的价值及意义,从使用层面了解 JVM 存在的意义,也是本节课程的重点内容;

  • 了解 JVM 整体结构,该结构图是从宏观层面,介绍的虚拟机的整体结构模块,后续会对每个模块进行细致的介绍与讲解,此处可视作了解内容,为后续内容的学习奠定基础;

  • 了解如何查看自己所使用的 JVM 版本,安装完成 JDK 的学习者,都可以进行查看;

  • 了解 JVM ,JRE 和 JDK 三者直接的区别,这是学习 JVM 前需要掌握的基础知识。

    本节内容是我们初次了解 JVM,从概念的角度去了解 JVM,为我们后续章节内容的学习打下了良好的基础。

2. JVM 定义

定义: JVM (Java Virtual Machine 简称 JVM),亦可称之为 Java 虚拟机。它是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,它是 Java 最具吸引力的特性之一。

图片描述

虚拟机:从字面意义上来理解,虚拟机是一个虚拟化出来的计算机。

举个例子:我们经常在 Windows 操作系统上安装 Linux 的虚拟机,然后在 Linux 虚拟机上进行 Shell 脚本的编写练习,那么从这个角度上来说, Linux 虚拟机就类似于 JVM ,不同的是 Linux 虚拟机支撑了 Shell 脚本的运行环境,而 JVM 支撑了 Java 语言的运行。

JVM 是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

3. JVM 的作用

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

  • 跨平台性:Java 语言之所以有跨平台的优点,完全是 JVM 的功劳,跨平台性是 JVM 存在的最大的亮点。

    以上一个知识点部分所举出例子来说,Windows 操作系统安装上 JVM 之后,可以支持 Java 程序的运行; Linux 操作系统安装上 JVM 之后,可以支持 Java 程序的运行;同理,Unix 操作系统等等所有我们熟悉的操作系统,安装上 JVM 之后,都可以支持 Java 程序的运行。

这大大提升了 Java 语言的平台灵活性,能够在众多语言争鸣的时代,脱颖而出。

  • 优秀的垃圾回收机制: Java 语言的诞生,极大的降低了软件开发人员的学习难度,除了 Java 面向对象编程的特性能够降低学习难度以外,还有一个比较重要的点,就是在进行 Java 编程的时候,可以更少的去考虑垃圾回收机制。

    学习过 C 语言的技术人员都能够体会这一点,因为 C 语言编程过程中,要通过代码手动实现内存垃圾的回收与空间释放,这提升了编程的难度,因为考虑内存空间释放,更多的会涉及到底层的知识,这是非常高的一个门槛。从 JVM 的角度来说,JVM 拥有自己的垃圾回收机制,为开发人员分担了部分工作。

Tips:JVM 在 Java 语言中占据了非常重要的地位,学习 JVM 是 Java 技术人员必须要做的事情,目前企业对于 Java 从业者对 JVM 的掌握程度要求非常高,是重点学习内容。

4. 查看自己的 JVM

我们知道,如果需要运行 Java 程序,必须要安装 JDK,这说明 JDK 中就包含了支持 Java 语言运行的JVM ,我们来看下如何查看本机的 JVM 信息。

无论是 Windows 操作系统还是 Linux 操作系统,正确安装 JDK 并且配置好环境变量后,在命令行输入如下命令进行查看:

java -version

以本人的机器为例,可以看到如下的执行结果:

C:\Users\Wayne.WangTJ>java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

我们仔细看下最后一句执行结果,Java HotSpot™ 64-Bit Server VM (build 25.191-b12, 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,我们继续来看下边的讲解,彻底了解三者之间的联系与区别。

图片描述

三者的区别

  • 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. 小结

本节课程主要是对 JVM 的定义以及作用进行一个简单的介绍,通过对 JVM 的整体结构进行描述,使我们了解了 JVM 的基本情况,为后续的学习奠定良好的基础。