JVM系列(一):JVM与Java体系结构

作者:陆金龙    发表时间:2022-11-19 20:11   

关键词

本文基于尚硅谷-宋红康的《JVM从入门到精通》培训视频整理。

主要内容:

  • Java与JVM简介
  • Java及JVM的发展历程
  • 虚拟机与Java虚拟机
  • JVM整体结构
  • Java代码执行流程
  • JVM的架构模型
  • JVM的生命周期

    典型的虚拟机架构,分为基于栈的指令集架构和基于寄存器的指令集架构两种方式。JVM是基于栈的架构模型。

    JVM、Java、开发框架、应用程序的关系如下:

    

    JVM的重要性和价值不亚于上层框架(例如微服务框架等)。JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础。

    学习Java虚拟机规范和Java虚拟机,HotSpot为主。

1.Java与JVM简介

Java

     跨平台的Java语言。

     Java语言有庞大的用户群和成熟的软件生态,是目前应用最广泛的软件开发平台之一。

     开源的JDK有Oracle发布的OpenJDK,开源的JVM还有Apache下的Harmony,Intel和IBM主导研发。

JVM

Java虚拟机(JVM,Java Virtual Machine)是Java平台的基石。它是负责硬件与操作系统的独立性、编译代码的小尺寸以及保护用户免受恶意程序攻击的能力的技术的组成部分。

Java虚拟机是一种抽象计算机。就像真正的计算机机,它有一个指令集,并在运行时操纵各种内存区域。

JVM是跨语言的JVM平台,支持Java、Kotlin、JavaScript、Scala、Groovy、JRuby等语言,只要提供相应语言的编译器。

2.Java及JVM的发展历程

Java的发展历程

  • 1990年,James Gosling领导的GreenTeam,开发出新的程序语言,命名为Oak,后命名改为Java。
  • 1995年,Sun公司正式发布Java和HotJava产品。
  • 1996年1月,发布JDK1.0。1998年发布JDK1.2.将java分成了J2EE、J2SE、J2ME面向企业应用、桌面应用和移动设备应用。2000年发布JDK1.3,Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。
  • 2002年,发布JDK1.4,Classic虚拟机退出。
  • 2004年,发布JDK1.5, 改名JavaSE 5.0,里程碑的版本。
  • 2006年,发布JDK6,Java开源并建立了OpenJDK。Hotspot为OpenJDK的默认虚拟机。
  • 2009年4月20,Oracle宣布收购sun,2010年1月27日,oracle宣布完成对Sun公司的收购。Solaris操作系统、Java和MySQL数据库融入Oracle公司。此时,Oracle拥有了市场占有率最高的两款虚拟机HotSpot和JRocket
  • 2011年,发布JDK7。启用了新的垃圾回收器G1(目前主流使用的)。
  • 2014年3月,发布JDK8
  • 2017年,发布JDK9。将G1设置为默认GC,替代CMS。IBM的虚拟机J9开源。
  • 2018年,发布JDK11,,LTS版本。发布ZGC。调整JDK授权许可。
  • 2019年,发布JDK12,加入Redhat领导开发的Shenandoah GC。

JVM发展历程

Sun Classic VM:世界上第一款商用Java虚拟机。1996年随JDK1.0一同发布。JDK1.4时淘汰。内部只提供解释器,用JIT需要外挂,二者不能同时使用。

Exact VM:JDK1.2时,sun提供了此虚拟机。可以知道内存中某个位置的数据具体是什么类型。具备现代高性能虚拟机的雏形:热点探测、编译器与解释器混合工作模式。只在Solaris平台短暂使用。其他平台还是Classic VM。

HotSpot虚拟机:JDK1.3时,HotSpot VM称为默认的虚拟机,一直到现在。OracleJDK和OpenJDK都使用HotSpot VM为默认的虚拟机。名称中的HotSpot指的是热点代码探测技术,通过计数器找到最具编译价值的代码,触发即时编译或栈上替换。通过解释器与及时编译器的协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。(其他两款商用虚拟机JRocket和J9没有方法区的概念)

JRockit:有影响力的三大商用虚拟机之一。原BEA公司的产品,2008年被Oracle收购。专注于服务器端应用,不太关注程序启动速度,因此JRoockit内部不包含解释器实现,全部代码都考即时编译器编译后执行。JRockit JVM是目前世界上最快的JVM。优点:显著的性能提升,大幅度地节约硬件成本。

IBM J9:简称IT4J,有影响力的三大商用虚拟机之一。市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM。在IBM自己的产品中使用,是很稳定的,速度很快,号称世界上最快的Javax。与自己的硬件耦合度高,通用性比不了JRockit。

CDC/CLDC HotSpot Implementation VM:JavaME产品线上的两款虚拟机。KVM:CLDC-HI早起产品,KVM简单、轻量、高度可移植,低端设备上维持一些市场。

Azul VM:与特定硬件平台绑定、软硬件配合的专有虚拟机。运行于Azul System公司的专有硬件Vega系统上的Java虚拟机。基于HotSpot进行大量改进而来。

Liquid VM:BEA公司开发,运行在自家Hypervisor系统上。Liquid VM就是在JRockit VE。随着JRockit 终止开发,Liquid VM项目也停止了。

3.虚拟机与Java虚拟机

虚拟机

    虚拟机就是一台虚拟的计算机,是一款软件,用来执行一系列虚拟计算机指令。分为系统虚拟机和程序虚拟机。系统虚拟机完全是对物理计算机的仿真,程序虚拟机专门为执行单个计算机程序而设计。Java虚拟机就是典型的程序虚拟机。

Java虚拟机

Java虚拟机是执行Java字节码的虚拟计算机。Java虚拟机是二进制字节码的运行环境,Java字节码是Java虚拟机运行的原材料(Java字节码可以是Java语言或其他语言编译而成)。

所有Java程序都运行在Java虚拟机内部。

作用:Java虚拟机负责装载字节码到其内部,解释/编译为对应平台的机器指令执行。

特点:一次编译,到处运行。自动内存管理,自动进行垃圾回收。

虚拟机所处的位置:在操作系统之上。

JDK构成:JVM包含在JDK内。

4.JVM的整体结构

主要包括Class Files、类加载子系统(Class Loader)、运行时数据区(Runtime Data Area)、执行引擎(Excution Engine)等部分。

JVM整体结构简图如下:

其中多个线程共享堆和方法区,而Java栈、本地方法栈和程序计数器是每个线程独有一份。Java栈即Java虚拟机栈。

操作系统只能识别机器指令。需要借助于执行引擎将虚拟机指令翻译成机器指令,才能在机器上最终执行指令。

5.Java代码执行流程

解释执行是为了保证响应时间的,快速开始逐行执行。

JIT 对热点代码使用JIT编译器机器指令,在方法区缓存起来,便于反复调用执行。

6.JVM的架构模型

    JVM基于栈的指令集架构。

    基于栈的指令集架构,适用于资源受限的系统。

    基于栈的指令集架构的特点:

  • 适用于资源受限的系统,例如嵌入式系统。
  • 避开寄存器的分配难题:使用零地址指令方式分配。
  •  执行过程依赖于操作栈。指令集更小,编译器容易实现。
  • 不需要硬件支持,可移植性更好,更好实现跨平台。
  • 是8位的。

    基于寄存器的指令集架构的特点:

  • 性能优秀,执行效率高。
  • 直接依赖硬件,可移植性差。
  • 指令集大,但完成一项操作需要的指令数更少。
  • 使用一级地址、二级地址、三级地址为主。
  • 寄存器是16位的。

7.JVM的生命周期

虚拟机的启动

通过引导类加载器(bootstrap class loader)创建一个初始类来完成,这个类由虚拟机的具体实现指定。

虚拟机的执行

运行中的Java虚拟机有一个清晰的任务:执行Java程序。程序开始执行时Java虚拟机运行,程序结束时Java虚拟机停止。执行Java程序时,实际是正在执行一个叫Java虚拟机的进程。

虚拟机的退出

程序正常执行结束。

程序执行过程中遇到异常或错误。

由于操作系统出错导致JVM进程终止。

主动结束进程。

JNI来加载和卸载JVM使的退出情况。