JVM(学习预热 - 走进Java)(持续更新迭代)

news2024/11/27 23:47:40

目录

一、彻底认识Java虚拟机

开创世纪:Sun Classic

开创世纪:Exact VM

武林霸主:HotSpot VM

移动端虚拟机:Mobile/Embedded VM

“三大”其二:BEA JRockit/IBM J9 VM

软硬结合:BEA Liquid VM/Azul VM

其他虚拟机

二、Java的未来

无语言倾向

新一代即时编译器

向 Native 迈进

灵活的胖子

语言语法持续增强

其他


一、彻底认识Java虚拟机

开创世纪:Sun Classic

Sun Classic 虚拟机是“世界上第一款商用 Java 虚拟机”,因此,它又被称为虚拟机始祖。

缺点:这款虚拟机只能使用纯解释器方式来执行 Java 代码,如果要使用即时编译器那就必须进行外挂,

但是假如外挂了即时编译器的话,即时编译器就会完全接管虚拟机的执行系统,解释器便不能再工作了。

开创世纪:Exact VM

为解决 Classic 虚拟机所面临的各种问题,提升运行效率,在JDK 1.2时,Exact VM的虚拟机横空出世!

它的编译执行系统已经具备现代高性能虚拟机雏形,如热点探测、两级即时编译器、编译器与解释器混合工作模

式等。

Exact VM 因为它使用准确式内存管理而得名(Exact Memory Management,也可以叫Non-Conservative/

Accurate Memory Management)

何为准确是内存管理?

准确式内存管理是指虚拟机可以知道内存中某个位置的数据具体是什么类型。

在 JDK 1.2 时,它与 HotSpot VM 并存,但默认是使用 Classic VM(用户可用 java-hotspot 参数切换至

HotSpot VM )

在 JDK 1.3 时, HotSpot VM 成为默认虚拟机, Classic VM 仍作为虚拟机的“备用选择”发布(使用 java-

classic 参数切换),直到 JDK 1.4 的时候, Classic VM 完全退出商用虚拟机的历史舞台,与 Exact VM 一起进

入了 Sun Labs Research VM 之中。

武林霸主:HotSpot VM

HotSpot VM 是 Sun/OracleJDK 和 OpenJDK 中的默认 Java 虚拟机,也是目前使用范围最广的 Java 虚拟

机。这个虚拟机最初并非是为 Java 语言而研发的,它来源于 Strongtalk 虚拟机, Sun 公司注意到这款虚拟机在

即时编译等多个方面有着优秀的理念和实际成果,于是,在 1997 年收购了 Longview Technologies 公司,从而

获得了 HotSpot 虚拟机。

我们平时所提及的“高性能Java虚拟机”一般是指HotSpot、JRockit、J9 这类在通用硬件平台上运行的商用

虚拟机。

其实HotSpot与Exact虚拟机基本上是同时期的独立产品,HotSpot出现得还稍早一 些,一开始HotSpot就

是基于准确式内存管理的,而Exact VM之中也有与HotSpot几乎一样的热点探测 技术,为了Exact VM和

HotSpot VM哪个该成为Sun主要支持的虚拟机,在Sun公司内部还争吵过一场,HotSpot击败Exact并不能算技

术上的胜利),HotSpot虚拟机的热点代码探测能力可以通过执行计数器 找出最具有编译价值的代码,然后通知

即时编译器以方法为单位进行编译。

如果一个方法被频繁调 用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译(On-

Stack Replacement,OSR)行为。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳

执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减 小,这样有助于

引入更复杂的代码优化技术,输出质量更高的本地代码。

移动端虚拟机:Mobile/Embedded VM

众所周知,Java不仅有主打服务端的Java SE产品线,在移动端和嵌入式市场也运用广泛。Java ME作为Java

在移动端的产品线,相对Java SE的发展就没那么成功。Oracle公司在Java ME这条产品线上的虚拟机名为CDC-HI

(C Virtual Machine,CVM)和CLDC-HI(Monty VM),相对Java SE产品线的HotSpot虚拟机就要低调很

多,但它们并不是由HotSpot直接裁剪而来,而是借鉴了一些技术,并没有直接的血缘关系。在移动市场被

Android和iOS二分天下的情况下,CDC在智能手机上略微有点声音的产品是Oracle ADF Mobile,不过也只是少

量的市场份额。

而在嵌入式设备上,Java ME Embedded又和自家的Java SE Embedded(eJDK)有着直接的竞争关系,而

用户能用Java SE的地方自然就不会选择用Java ME,所以市场在快速萎缩。Java SE Embedded里带的Java虚拟

机当然还是HotSpot,但这是为了适应嵌入式环境专门定制裁剪的版本,尽可能在支持完整的Java SE功能的前提

下向着减少内存消耗的方向优化,譬如只留下了客户端编译器(C1),去掉了服务端编译器(C2);只保留

Serial/Serial Old垃圾收集器,去掉了其他收集器等。

“三大”其二:BEA JRockit/IBM J9 VM

除了Sun/Oracle研发的Java虚拟机,BEA System公司的JRockit与IBM公司的IBM J9则是除了HotSpot虚拟

机之外的两款主流Java虚拟机了,这三款虚拟机也曾经并称为“ 三大商业Java虚拟机”。

JRockit虚拟机是BEA公司在2002年收购Appeal Virtual Machines公司获得的,这款虚拟机在相当一段时间

内号称为“世界上速度最快的Java虚拟机”。它是专注于服务器硬件和服务端应用场景优化的虚拟机,因此不太关

注程序的启动速度,内部不包含解释器。

虽然如此,JRockit虚拟机的垃圾回收算法和Java Mission Control故障处理套件相比其它所有虚拟机表现更

佳。Oracle在2008年收购BEA之后,一直在推进 HotSpot 与 JRockit 两款各有优势的虚拟机进行融合互补,而

JRockit也永远停留在了R28版本。

J9虚拟机作为“三大商业Java虚拟机”的另外一款,是IBM力推的一款虚拟机。与BEA JRockit只专注于服务

端应用不同,IBM J9虚拟机的市场定位与HotSpot比较接近,主要应用IBM公司自己开发的各种Java产品,应用

方向全面考虑服务端、桌面应用,嵌入式等,再和其他产品(如IBM WebSphere等)搭配以及在IBM AIX和z/OS

这些平台上部署Java应用。

软硬结合:BEA Liquid VM/Azul VM

除了HotSpot、JRockit、J9这类在通用硬件平台上运行的“高性能Java虚拟机”,还有一类运行在特殊硬件

平台专有虚拟机。这类虚拟机往往与特定的硬件平台进行绑定,所以有着更高的执行效率和性能,这类专有虚拟

机的代表是BEA Liquid VM和Azul VM。

Liquid VM也就是现在的JRockit VE(Virtual Edition),它是BEA公司开发的可以直接运行在自家

Hypervisor系统上的JRockit虚拟机的虚拟化版本。Liquid VM自己本身实现了一个专用操作系统的必要功能,如

线程调度、文件系统、网络支持等,这种虚拟机越过操作系统直接调用硬件的方式可以最大发挥底层硬件的能

力,极大地提高了Java代码执行性能。

Azul VM是运行于Azul Systems公司的专有硬件Vega系统上的Java专用虚拟机,在HotSpot基础上改动而

来。每个Azul VM实例都可以管理至少数十个CPU和数百GB的内存的硬件资源,并提供在巨大内存范围内停顿时

间可控的垃圾收集器(即业内赫赫有名的PGC和C4收集器),为专有硬件优化的线程调度等优秀特性。然而随着

虚拟机技术的不断发展,商业上的缺陷是的专用虚拟机逐渐落寞,最终Azul System公司也放弃Vega产品线,把

全部精力投入到Zing和Zulu产品线中。

Zing虚拟机是Azul System公司在Sun还未被收购之前,从HotSpot某旧版代码分支基础上独立出来重新开

发而来。经过多年的内部自研,Azul公司为它编写了新的垃圾回收器,支持几TB量级的堆空间管理,同时也配套

了ZVision/ZVRobot这类的性能监控工具,可以方便用户监控JVM的运行状态,比如锁状态竞争、对象分配过

程、热点代码探测等细节。总的来说,Zing拥有高吞吐低延迟、快速预热、易于监控的诸多优点,这些也是Zing

的核心价值和卖点。

其他虚拟机

除此之外,当然还有许多其他虚拟机,例如:Apache Harmony/Google Android Dalvik VM等其他虚拟机。

二、Java的未来

无语言倾向

2018年4月,Oracle Labs新公开了一项黑科技:Graal VM,这是一个在HotSpot虚拟机基础上增强而成 的

跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、Groovy、

Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支持其他像

JavaScript、Ruby、Python和R语言等。

Graal VM被官方称为“Universal VM”和“Polyglot VM”,这是一个在HotSpot虚拟机基础上增强而成

的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、

Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支 持其他像

JavaScript、Ruby、Python和R语言等。Graal VM可以无额外开销地混合使用这些编程语言, 支持不同语言中混

用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。

Graal VM的基本工作原理是将这些语言的源代码(例如JavaScript)或源代码编译后的中间格式 (例如

LLVM字节码)通过解释器转换为能被Graal VM接受的中间表示(Intermediate Representation,IR),譬如设

计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++语言,这个过程称为程序特化(Specialized,也

常被称为Partial Evaluation)。

Graal VM提供了Truffle工具集来快速构建面向一 种新语言的解释器,并用它构建了一个称为Sulong的高性

能LLVM字节码解释器。

从更严格的角度来看,Graal VM才是真正意义上与物理计算机相对应的高级语言虚拟机,理由是它与物理硬

件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关

对Java而言,Graal VM本来就是在HotSpot基础上诞生的,天生就可作为一套完整的符合Java SE 8标准的

Java虚拟机来使用。

Graal VM 与 HotSpot 的差异主要在于即时编译,在执行效率、编译质量上两者互有胜负。

参见TIOBE编程语言排行榜:TIOBE Index - TIOBE

新一代即时编译器

HotSpot VM 有两个即时编译器(C1,编译耗时短但输出代码优化程度较低的客户端编译器;C2,编译耗

时长但输出代码优化质量更高的服务端编译器),他们通过分层编译机制与解释器互相配合共同构成 HotSpot

VM 的执行子系统;

Graal 编译器(JDK 10 加入 HotSpot 的全新即时编译器),由 Java 编写,目标是替代 C2 编译器,C2 历

史悠久(早 Graal 编译器 20 年),但过于复杂难以维护;Graal 比 C2 更易于做复杂的优化(如部分逃逸分析,

Partital Escape Analysis),更易于做激进预测性优化(Aggressive Speculative Optimization);

也拥有比C2更容易使用激进预测性优化(Aggressive Speculative Optimization)的策略,支持自定义的预测性

假设等。

Graal编译器为Java虚拟机执行代码的最新引擎,它的持续改进,会同时为HotSpot与Graal VM注入更快更强的驱

动力使用-XX:+UnlockExperimentalVMOptions-XX:+UseJVMCICompiler参数来启用Graal编译器

向 Native 迈进

近几年在从大型单体应用架构向小型微服务应用架构(更甚者如无服务架构)发展的技术潮流下,Java 表现得有

些劣势;

  • 跨进程、面向用户程序的类型信息共享(Application Class Data Sharing,App CDS),允许把加载解析后

的类型信息缓存起来,从而提升下次启动速度;JDK 10 开始支持到用户代码级;

  • 无操作的垃圾收集器(Epsilon),只做内存分配,不做回收,对运行完就退出的应用十分友好;
  • 提前编译(Ahead of Time Compilation,AOT),可以减少即时编译的预热时间,直接加载已经编译好的

二进制库直接调用;但它破坏了一次编写,到处运行的承诺;它并不能生成本地代码,仍需运行在 JVM 之

上;(Substrate VM 给出了一个极小型运行时环境,并通过本地镜像构造达到直接运行目标程序的效果);

灵活的胖子

模块化 & 开放性;

语言语法持续增强

JDK 10,Local-Variable Type Inference,本地类型推断;

JDK 11,Local-Variable Syntax for Lambda Parameters;

JDK 13,Switch Expressions,switch 语句的表达式支持;

JDK 13,Text Blocks,文本块功能;

草拟,Enhanced Enums,常量类绑定数据类型,鞋带额外信息;

草拟,Lambda Leftovers,下划线表示 Lambda 中的匿名参数;

草拟,Pattern Matching for instanceof,instanceof 判断过的类型在条件分支免强转;

Project Loom,提供类似 Golang 的 Groutine 的用户线程,可以更轻量,软件自身进行调度(非直接有操作系统内核调度);

Project Valhalla,提供值类型和基本类型的泛型支持,提供不可变类型和非引用类型的声明;

Project Panama,消弭 JVM 与本地代码之间的界限

(JNI 虽然可以调用本地代码,但其只能说是达到能用的标准,频繁执行的性能开销非常高);

其他

其他知识点,请读者去阅读深入理解Java虚拟机第三版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

更新子节点的优化策略1:目标old节点的位置预测

更新子节点的优化策略1:目标old节点的位置预测: 如果 oldStartVnode 和 newStartVnode 是同一个节点,直接 patchVnode,同时 oldStartIdx、newStartIdx 索引都加 1(向右移动)如果 oldEndVnode 和 newEndVno…

PE结构之 重定位表

那么,我们找到了某个 需要修改的绝对地址 的RVA, 将这个RVA转换成FOA后,这个绝对地址是读DWORD ,还是QWORD? 就是说,32位和64位是否有区别? 实验: 找到重定位表的数据,并观察在内存中和文件中的区别 将引用dll的exe文件,设置一下基址 同时DLL文件的基址和EXE文件设置一样,并…

肝了4天,我用ChatTTS和LLM让deeplearning.ai课程说上流畅中文

以下是「 豆包MarsCode 体验官」优秀文章,作者X2046。 我们都知道外网上有很多优秀的视频教程平台,比如 Coursera 和 deeplearning.ai。尤其是后者,由吴恩达老师与OpenAI、Langchain、LlamaIndex、AutoGen等公司和作者合作,推出了…

Spring Cloud Netflix Hystrix 熔断器讲解和案例示范

在分布式微服务架构中,每个服务之间相互依赖,当某个服务出现故障或延迟时,如果没有有效的故障隔离机制,可能导致整个系统雪崩式的失败。Netflix Hystrix 作为一种熔断器模式,旨在通过隔离服务之间的调用,提…

通过移动访问控制增强数据中心安全性

在当今数据驱动的世界里,信息是新的黄金标准,数据中心安全已成为每个 IT 部门的首要任务。数据隐私和道德管理不再仅仅是最佳实践,而是法律要求。因此,风险比以往任何时候都要高。 然后是内部威胁问题。根据 IBM 的 《2024 年数据…

Python案例--copy复制

在Python编程中,数据的复制是一个常见且重要的操作,它涉及到赋值、浅拷贝和深拷贝三种不同的概念。正确理解这三种操作对于编写高效且正确的程序至关重要。本文将通过一个简单的Python示例,探讨这三种数据复制方式的区别及其应用场景&#xf…

数据结构 ——— 单链表oj题:环状链表(求出环的入口节点)

目录 题目要求 手搓一个简易带环链表 代码实现 题目要求 给定一个链表的头节点 head,返回链表开始入环的第一个节点,如果链表无环,则返回NULL 手搓一个简易带环链表 代码演示: struct ListNode* n1 (struct ListNode*)mal…

深度学习:循环神经网络—RNN的原理

传统神经网络存在的问题? 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…

Mac上强大的菜单栏管理工具

想要Mac用的好,各种工具少不了,一款好用的软件对于提高使用效率和使用舒适度来说非常必要,iBar-强大的菜单栏图标管理工具 随着 Mac 运行的软件增加,状态栏中的图标也越来越多,不仅看得眼花缭乱,而且刘海屏…

基于SpringBoot+Vue的农场管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

ORM框架简介

什么是ORM? ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。简单…

CMake 属性之目录属性

【写在前面】 CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。 这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。 通过目录…

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口,使用频次最高。之前习惯了uniapp下的网络接口风格,使用起来贼简单方便。转战到鸿蒙上后,原始网络接口写着真累啊!目标让鸿蒙上网络接口使用,简单程度比肩uniapp,比Axios更轻量级。源码量也不多…

Spring Cloud全解析:链路追踪之springCloudSleuth简介

文章目录 springCloudSleuth简介链路追踪?SpringCloudSleuth术语链路示意图zipkin依赖配置 springCloudSleuth简介 链路追踪? 什么是链路追踪?就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示&#xff…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置) 前言多数据源配置引入aop依赖1. properties配置多数据源2. 创建数据源枚举类3. 线程参数配置类4. 数据源动态切换类5. 多数据源配置类HikariCP 版本…

【JS】用哈希法得到四数相加元组数

思路 根据题目这里是四个数组abcd的数相加,将数组两两分组,A大组为ab,B大组为cd由abcd0可得AB0,即B0-A遍历数组分别计算出AB大组所有sum值,先将A组sum值存进map里,再从map里面寻找有count个合适的B值&#…

Python in Excel 正式发布!

Excel 中的 Python 现已正式发布,适用于 Microsoft 365 商业版和企业版的 Windows 用户。去年 8 月,微软与 Anaconda 合作,通过集成 Python 为 Excel 引入了一个令人兴奋的新增功能,从而可以将 Python 和 Excel 分析无缝结合到同一…

使用npm i报错node-sass失败问题解决

node 版本:v14.15.4 解决方法: npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后,再npm i 就可以下载成功 亲测有效

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据,会影响视图2.5.2通过修改视图,会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…

历时一个多月,搭建了一款培训考试小程序系统

前不久,一位在机构单位工作的朋友联系到我,说他们需要搭建一款内部培训考试系统,是关于安全知识学习与考试的。 此处省略好多张聊天页...... 为此,针对用户的需求,在搭建前,我做了大量的竞品分析&#xff…