秃了头的老铁带你一脚踏进Java虚拟机

欢迎关注微信公众号:Coding我不配  
获取更多干货,一起每天进步一点点

在这里插入图片描述

1 为何需要 JVM

学习 java 入门的时候,首先需要搭建一个开发环境,下载 JDK,配置变量环境,one two three… 一顿猛虎操作,终于搞定了。接下来就开始写个 HelloWorld.java 跑起来…一脚踏进门,修行靠个人。

Java 虚拟机 JVM, 全称 Java Virtual Machine.它能识别 .class 后缀的文件,并且能够解析它的指令,最终调用操作系统的接口,运行程序,完成所要的操作。

可以把 JVM 当成是一个翻译器,会持续不断的翻译执行 Java 字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的,即具体使用的是哪个操作系统。

通过 JVM 打通自己写的程序跟操作系统进行交互,看下图
秃了头的老铁带你一脚踏进Java虚拟机_第1张图片

从上图中可以看出,通过 JVM 这个抽象层,Java 程序可以实现跨平台。JVM 只需要保证能够正确执行 .class 文件,就可以运行在 Linux、MacOS 等平台。做到 Java 跨平台的意义在于一次编译,处处运行。

2 JDK、JRE、JVM 的关系

  • JDK,Java 开发工具包(Java Development Kit),是整个 Java 开发的核心,包括了 Java 运行环境 JRE(Java Runtime Envirnment)、一堆 Java 工具(javac、java、jar 等)和 Java 基础的类库。

  • JRE ,指 Java 运行环境(Java Runtime Environment)。它主要包含两个部分,JVM 的标准实现和 Java 的一些基本类库。它相对于 JVM 来说,多出来的是一部分的 Java 类库。

  • JVM :Java 虚拟机(Java Virtual Machine),是 Java 能够跨平台的核心。所有的 Java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机上执行。

JVM、JRE、JDK 它们三者之间的关系,可以用一个包含关系表示:

秃了头的老铁带你一脚踏进Java虚拟机_第2张图片

3 Java 代码如何运行起来的

直接撸一把代码:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

上面 HelloWorld.java,它遵循的就是 Java 语言规范。其中,调用了 System.out 等模块,也就是 JRE 里提供的类库。

使用 JDK 的工具 javac 进行编译后,会产生 HelloWorld.class 的字节码。

Java 字节码是沟通 JVM 与 Java 程序的桥梁,使用 javap 来查看一下字节码:

0 getstatic #2 
2 ldc #3 
4 invokevirtual #4 
7 return

Java 虚拟机采用基于栈的架构,其指令由操作码和操作数组成。这些字节码指令,就叫作 opcode,JVM 就是靠解析这些 opcode 和操作数来完成程序的执行的。

执行过程图:
秃了头的老铁带你一脚踏进Java虚拟机_第3张图片

其中 JVM 是重点。JVM 是一个虚拟机规范,有非常多的实现。其中最流行是 Oracle 的 HotSpot.

4 JVM 内存

JVM 是可运行 Java 代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。

以 JDK1.8 为例

秃了头的老铁带你一脚踏进Java虚拟机_第4张图片

从图中可以看出:

  • JVM 堆中的数据是共享的,是占用内存最大的一块区域。

  • 可以执行字节码的模块叫作执行引擎。

  • 执行引擎在线程切换时怎么恢复?依靠的就是程序计数器。

  • JVM 的内存划分与多线程是息息相关的。像我们程序中运行时用到的栈,以及本地方法栈,它们的维度都是线程。

  • 本地内存包含元数据区和一些直接内存

JVM 在运行时,会从操作系统申请大块的堆内内存,进行数据的存储。JVM 的运行时区域是栈,而存储区域是堆。

5 JVM 学习路线

一脚踏进门,修行靠个人。JVM 涉及到的知识很多,也比较难懂,需要一定的实操以便能理解吃透。

学习JVM,说白了就是对第4章节图中的各个模块理解。

附一张学习路线图,仅供参考

秃了头的老铁带你一脚踏进Java虚拟机_第5张图片

欢迎关注微信公众号:Coding我不配  
获取更多干货,一起每天进步一点点

在这里插入图片描述

你可能感兴趣的:(java核心技术干货,java面试36题,web开发)