【JVM学习笔记01】概述

JVM概述

JVM 体系结构概览:

image-20201109202220297

一、概述

1.1 Java:跨平台的语言

Java 是目前应用最为广泛的软件开发平台之一。随着 Java 以及 Java 社区的不断壮大 Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

  • 作为一个平台,Java 虚拟机扮演着举足轻重的作用
  • Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分
  • 作为一种文化,Java 几乎成为了“开源”的代名词。
  • 第三方开源软件和框架。如Tomcat、Struts,MyBatis,Spring等。
  • 就连 JDK 和 JVM 自身也有不少开源的实现,如OpenJDK、Harmony。
  • 作为一个社区,Java 拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到 Java 的身影。其应用形式之复杂、参与人数之众多也令人咂舌。

image-20201109203448719

每种语言都需要转换成字节码文件,最后转换的字节码文件都能通过 Java 虚拟机进行运行和处理。

1.2 JVM:跨语言的平台

JVM是一个跨语言的平台(语言无关性),是一个通用的、与机器去无关的执行平台,任何其他语言的实现者都可以将Java虚拟机作为他们语言的运行基础,以Class文件作为他们产品的交付媒介。

实现语言无关性的基础是虚拟机与字节码存储格式。

随着 Java 7 的正式发布,Java 虚拟机的设计者们通过 JSR-292 规范基本实现了在 Java 虚拟机平台上运行非 Java语言编写的程序。

Java 虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说 Java 虚拟机拥有语言无关性,并不会任何编程语言“终身绑定“,它只与”Class文件“这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。基于安全方面考虑,《Java虚拟机规范》中要求Class文件必须应用许多强制性的语法和结构化约束,图灵完备的字节码格式可以保证任意一门编程语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。

image-20201109203638786

1.3 虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

  • 大名鼎鼎的 Visual Box,VMware 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
  • 程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令我们称为 Java 字节码指令。

无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

二、JVM与Java体系结构

Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成。

JVM 平台的各种语言可以共享 Java 虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。

Java 技术的核心就是 Java 虚拟机(JVM,Java Virtual Machine),因为所有的 Java 程序都运行在 Java 虚拟机内部。

2.1 JVM的位置

JVM是运行在操作系统之上的,不同的系统所对应的JVM是不同的。(jdk 有不同系统的安装版本)

image-20201109212059116
  • 作用

    Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

  • 特点

    • 一次编译,到处运行
    • 自动内存管理
    • 自动垃圾回收功能

2.2 Java代码执行流程

image-20201110145715568

整个过程中共有两个编译过程:

  • 前端编译:将Java代码编译为字节码文件,通过词法分析、语法分析、语义分析生成图灵完备的字节码文件
  • 后端编译:即解析执行阶段,将字节码编译为机器码,供操作系统执行

2.3 JVM架构模型

Java 编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。这两种架构之间的区别:

基于栈式架构的特点:

  • 设计和实现更简单,适用于资源受限的系统
  • 避开了寄存器的分配难题:使用零地址指令方式分配
  • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现
  • 不需要硬件支持,可移植性更好,更好实现跨平台

基于寄存器架构的特点

  • 典型的应用是 x86 的二进制指令集:比如传统的 PC 以及 Android 的 Davlik 虚拟机
  • 指令集架构则完全依赖硬件,可移植性差
  • 性能优秀和执行更高效
  • 花费更少的指令去完成一项操作
  • 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主

由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

2.4 JVM的生命周期

2.4.1 虚拟机的启动

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

2.4.2 虚拟机的执行

  • 一个运行中的 Java 虚拟机有着一个清晰的任务:执行 Java 程序。
  • 程序开始执行时他才运行,程序结束时他就停止。
  • 执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的进程。

2.4.3 虚拟机的退出

有如下的几种情况:

  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统用现错误而导致 Java 虚拟机进程终止
  • 某线程调用 Runtime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或 halt 操作。
  • 除此之外,JNI(Java Native Interface)规范描述了用 JNI Invocation API 来加载或卸载 Java 虚拟机时,Java 虚拟机的退出情况。

2.5 JVM分类

具体 JVM 的内存结构,其实取决于其实现,不同厂商的 JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以 Oracle HotSpot VM 为默认虚拟机。

2.5.1 HotSpot VM

HotSpot 历史 - 最初由一家名为“Longview Technologies”的小公司设计 - 1997年,此公司被 Sun 收购;2009年,Sun 公司被甲骨文收购。 - JDK 1.3 时,HotSpot VM 成为默认虚拟机

目前 HotSpot 占有绝对的市场地位,称霸武林

  • 不管是现在仍在广泛使用的 JDK 6 ,还是使用比例较多的 JDK 8 中,默认的虚拟机都是 HotSpot
  • Sun/Oracle JDK 和 OpenJDK 的默认虚拟机
  • 因此本课程中默认介绍的虚拟机都是 HotSpot,相关机制也主要是指 HotSpot 的 GC 机制。(比如其他两个商用虚机都没有方法区的概念)

从服务器、桌面到移动端、嵌入式都有应用。

名称中的 HotSpot 指的就是它的热点代码探测技术。

  • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
  • 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡

2.5.2 JRockit

JRockit专注于服务器端应用

  • 它可以不太关注程序启动速度,因此 JRockit 内部不包含解析器实现,全部代码都靠即时编译器编译后执行。

大量的行业基准测试显示,JRockit JVM 是世界上最快的 JVM。

  • 使用 JRockit 产品,客户已经体验到了显著的性能提高(一些超过了70%)和硬件成本的减少(达50%)。

优势:全面的 Java 运行时解决方案组合

  • JRockit 面向延迟敏感型应用的解决方案 JRockit Real Time 提供以毫秒或微秒级的 JVM 响应时间,适合财务、军事指挥、电信网络的需要
  • MissionControl 服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。

2008年,JRockit 被 Oracle 收购。

Oracle 表达了整合两大优秀虚拟机的工作,大致在 JDK 8 中完成。整合的方式是在 HotSpot 的基础上,移植JRockit 的优秀特性。

2.5.3 Taobao JVM

由 AliJVM 团队发布。阿里,国内使用 Java 最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。

基于 OpenJDK 开发了自己的定制版本 AlibabaJDK,简称 AJDK。是整个阿里 Java 体系的基石。

基于 OpenJDK HotSpot VM 发布的国内第一个优化、深度定制且开源的高性能服务器版 Java 虚拟机

  • 创新的 GCIH(GC Invisible Heap)技术实现了 Off-Heap,即将生命周期较长的 Java 对象从 Heap 中移到Heap 之外,并且 GC 不能管理 GCIH 内部的 Java 对象,以此达到降低 GC 的回收频率和提升 GC 的回收效率的目的。
  • GCIH 中的对象还能够在多个 Java 虚拟机进程中实现共享
  • 使用 crc32 指令实现 JVM Intrinsic 降低 JNI 的调用开销
  • PMU Hardware 的 Java Profiling Tool 和诊断协助功能
  • 针对大数据场景的 ZenGC

TaoBao VM 应用在阿里产品上性能高,硬件严重依赖 Intel 的 CPU,损失了兼容性,但提高了性能

目前已经在淘宝、天猫上线,把 Oracle 官方 JVM 版本全部替换了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我姓弓长那个张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值