1.基本概念

JVM 是可运行 Java 代码的假象计算机,包括【一套字节码指令集】、【一组寄存器】、【一个栈】、【一个垃圾回收】,【堆】和【一个存储方法域】。JVM 是运行在操系统之上的,它与硬件没有直接的交互。

2.三种JVM

  1. Sun 公司的 HotSpot;
  2. BEA 公司的 JRockit;
  3. IBM 公司的 J9 JVM;

在 JDK 1.7 及其以前我们使用的都是 Sun 公司的 HotSpot,但由于 Sun 公司和 BEA 公司都被 Oracle 收购,JDK 1.8 将采用 Sun 公司的 HotSpot 和 BEA 公司的 JRockit 两个 JVM 种精华形成 JDK 1.8 的 JVM。

画外音:HotSpot 是官方默认虚拟机,它知道那一段代码经常运行,就会将其编译成机器代码,提高运行效率。JDK 1.8 的 HotSpot 已经放弃用永久代来实现方法区,转而使用元空间。

3.运行过程

我们都知道 Java 源文件,通过编译器,能够生产响应的 .class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码。

也就是如下:

  1. Java 源文件 ——> 编译器 ——> 字节码文件
  2. 字节码文件 ——> JVM ——> 机器码

每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

4.线程

这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。

Hotspot JVM 中 Java 线程与原生操作系统线程有直接的映射关系。当【线程本地存储】、【缓冲区分配】、【同步对象】、【栈】、【程序计数器】等准备好以后,就会创建一个操作系统原生线程。

Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,会释放原生线程和 Java 线程的所有资源。

Hotspot JVM 后台运行的系统线程主要有下面几个:

【JVM】JVM是什么?_JAVA

5.JVM 结构图

【JVM】JVM是什么?_JAVA_02

6.JVM 思维导图

【JVM】JVM是什么?_JAVA_03

 

PS:文章内容和图片通过网上收集、整理、润色,侵删!

不管做什么,只要坚持下去就会不一样!