JVM--理解介绍


JVM?JDK?JRE?关系?

JDK(Java Development Kit),它是实际上存在的,它包含JRE+编译、运行等开发工具.

JRE(Java Runtime Environment),它用于提供运行时环境。它是JVM的实现。它是实际存在的。它包含一组系统类库和JVM。

JVM是什么?

  JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译生成的.class 文件(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够跨平台(“一次编写,到处运行”)的原因(因为它会根据特定的操作系统生成对应的操作指令),Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

  JVM 的种类有很多,比如 HotSpot 虚拟机,它是 Sun/OracleJDK 和 OpenJDK 中的默认 JVM,也是目前使用范围最广的 JVM。我们常说的 JVM 其实泛指的是 HotSpot 虚拟机,还有曾经与 HotSpot 齐名为“三大商业 JVM”的 JRockit 和 IBM J9 虚拟机。但无论是什么类型的虚拟机都必须遵守 Oracle 官方发布的《Java虚拟机规范》,它是 Java 领域最权威最重要的著作之一,用于规范 JVM 的一些具体“行为”。

JVM 和操作系统的关系?

我们用一句话概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。

有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。JVM 只需要保证能够正确执行 .class 文件,就可以运行在诸如 Linux、Windows、MacOS 等平台上了。而 Java 跨平台的意义在于一次编译,处处运行,能够做到这一点 JVM 功不可没。比如我们在 Maven 仓库下载同一版本的 jar 包就可以到处运行,不需要在每个平台上再编译一次。

怎么理解Java跨平台?

https://blog.csdn.net/Iamthedoctor123/article/details/84451622

Java 虚拟机规范和 Java 语言规范的关系?

广义上来讲,JVM 是一种规范,它是最为官方、最为准确的文档;

狭义上来讲,由于我们使用 Hotspot 更多一些,我们一般在谈到这个概念时,会将它们等同起来。

左半部分是 Java 虚拟机规范,其实就是为输入和执行字节码提供一个运行环境。

右半部分是我们常说的 Java 语法规范,比如 switch、for、泛型、lambda 等相关的程序,最终都会编译成字节码。而连接左右两部分的桥梁依然是 Java 的字节码。

JVM 的内存布局(内存结构)?

我们写的 Java 代码到底是如何运行起来的?

 或者说JVM 的运行原理?执行流程是怎么样的?

过程如下:Java 文件->编译器>字节码->JVM->机器码。

把我们写好的*.java文件,通过javac命令编译(包含词法分析、语义分析等步骤)成字节码文件,也就是我们常说的.class文件。当我们使用 Java 命令运行 .class 文件的时候,实际上就相当于启动了一个 JVM 进程。然后 JVM 会翻译这些字节码,它有两种执行方式。常见的就是解释执行,将 opcode + 操作数翻译成机器代码;另外一种执行方式就是 JIT,也就是我们常说的即时编译,它会在一定条件下将字节码编译成机器码之后再执行。这些 .class 文件会被加载、存放到 metaspace 中,等待被调用,这里会有一个类加载器的概念。而 JVM 的程序运行,都是在栈上完成的,这和其他普通程序的执行是类似的,同样分为堆和栈。比如我们现在运行到了 main 方法,就会给它分配一个栈帧。当退出方法体时,会弹出相应的栈帧。你会发现,大多数字节码指令,就是不断的对栈帧进行操作。

简洁答

写好的*.java文件,通过javac命令编译成字节码文件(.class文件),然后通过类加载器将字节码加载到内存(运行时数据区)中,存放到 `元数据`区(metaspace) 中等待被调用,使用特定的命令解析器也就是我们俗称的**执行引擎(Execution Engine)**将字节码翻译成可以被底层操作系统执行的指令再去执行,这样就实现了整个 Java 程序的运行,这也是 JVM 的整体执行流程。

常见面试题

JVM 是如何进行内存区域划分的?

JVM 如何高效进行内存管理?

为什么需要有元空间,它又涉及什么问题?

JVM的内存区域是怎么高效划分的?

说一下 JVM 的内存布局和运行原理?

类的加载分为几个阶段?每个阶段代表什么含义?加载了什么内容?

如何判断一个对象是否“死亡”?

垃圾回收的算法有哪些?