共计 12437 个字符,预计需要花费 32 分钟才能阅读完成。
跟很多人一样,我一开始接触 Java 虚拟机只是因为面试须要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。因为装逼 但我通过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深刻地了解 Java 这门语言,以及为将来排查线上问题打下基础。
当我想学 JVM 的时候, 也是一脸懵逼 , 看了很多的视频, 有深, 有浅, 这些常识混起来, 也很懵逼, 所以 , 看了 B 站的宋红康 JVM 教程, 还不错, 就写个笔记记录一下
第 1 章 JVM 和 Java 体系架构
1、JVM 前言
作为 Java 工程师的你曾被挫伤过吗?你是否也遇到过这些问题?
- 运行着的线上零碎忽然卡死,零碎无法访问,甚至间接 OOM!
- 想解决线上 JVM GC 问题,但却无从下手。
- 新我的项目上线,对各种 JVM 参数设置一脸茫然,间接默认吧而后就 GG 了
- 每次面试之前都要从新背一遍 JVM 的一些原理概念性的货色,然而面试官却常常问你在理论我的项目中如何调优 VM 参数,如何解决 GC、OOM 等问题,一脸懵逼。
2、开发人员的病态
- 大部分 Java 开发人员,除了会在我的项目中应用到与 Java 平台相干的各种高精尖技术,对于 Java 技术的外围 Java 虚拟机理解甚少。
- 一些有肯定工作教训的开发人员,打心眼儿里感觉 SSM、微服务等下层技术才是重点,根底技术并不重要,这其实是一种轻重倒置的 ” 病态 ”。如果咱们把外围类库的 API 比做数学公式的话,那么 Java 虚拟机的常识就好比公式的推导过程。
- 计算机系统体系对咱们来说越来越远,在不理解底层实现形式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不意识高级语言
3、架构师在想甚么
架构师每天都在思考什么?
- 应该如何让我的零碎更快?
- 如何防止零碎呈现瓶颈?
知乎上有条帖子:应该如何看招聘信息,直通年薪 50 万 +?
- 参加现有零碎的性能优化,重构,保障平台性能和稳定性
- 依据业务场景和需要,决定技术方向,做技术选型
- 可能独立架构和设计海量数据下高并发分布式解决方案,满足性能和非性能需要
- 解决各类潜在零碎危险,外围性能的架构与代码编写
- 剖析零碎瓶颈,解决各种疑难杂症,性能调优等
4、为什么学习 JVM
- 面试的须要(BATJ、TMD,PKQ 等面试都爱问)
- 中高级程序员必备技能:项目管理、调优的需要
- 谋求极客的精力,比方:垃圾回收算法、JIT(即时编译器)、底层原理
5、Java VS C++
- 垃圾收集机制为咱们打理了很多繁琐的工作,大大提高了开发的效率,然而,垃圾收集也不是万能的,懂得 JVM 外部的内存构造、工作机制,是设计高扩展性利用和诊断运行时问题的根底,也是 Java 工程师进阶的必备能力。
- C 语言须要本人来分配内存和回收内存,Java 全副交给 JVM 进行调配和回收。
6、参考书籍
英文文档标准:https://docs.oracle.com/javas…
中文书籍:
7、课程章节
8、TIOBE 排行榜
TIOBE 排行榜:https://www.tiobe.com/tiobe-i…
9、Java 生态圈
Java 是目前利用最为宽泛的软件开发平台之一。随着 Java 以及 Java 社区的一直壮大 Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
-
作为一个平台,Java 虚拟机扮演着无足轻重的作用
- Groovy、Scala、JRuby、Kotlin 等都是 Java 平台的一部分
-
作为一种文化,Java 简直成为了 ” 开源 ” 的代名词。
- 第三方开源软件和框架。如 Tomcat、Struts,MyBatis,Spring 等。
- 就连 JDK 和 JVM 本身也有不少开源的实现,如 openJDK、Harmony。
- 作为一个社区,Java 领有全世界最多的技术拥护者和开源社区反对,有数不清的论坛和材料。从桌面应用软件、嵌入式开发到企业级利用、后盾服务器、中间件,都能够看到 Java 的身影。其利用模式之简单、参加人数之泛滥也令人咋舌。
10、Java 的跨平台性
- 每个语言都须要转换成字节码文件,最初转换的字节码文件都能通过 Java 虚拟机进行运行和解决
- 随着 Java7 的正式公布,Java 虚拟机的设计者们通过 JSR-292 标准根本实现在 Java 虚拟机平台上运行非 Java 语言编写的程序。
- Java 虚拟机基本不关怀运行在其外部的程序到底是应用何种编程语言编写的,它只关怀 ” 字节码 ” 文件。也就是说 Java 虚拟机领有语言无关性,并不会单纯地与 Java 语言 ” 一生绑定 ”,只有其余编程语言的编译后果满足并蕴含 Java 虚拟机的外部指令集、符号表以及其余的辅助信息,它就是一个无效的字节码文件,就可能被虚拟机所辨认并装载运行。
11、字节码
- 咱们平时说的 java 字节码,指的是用 java 语言编译成的字节码。精确的说任何能在 jvm 平台上执行的字节码格局都是一样的。所以应该统称为:jvm 字节码。
- 不同的编译器,能够编译出雷同的字节码文件,字节码文件也能够在不同的 JVM 上运行。
- Java 虚拟机与 Java 语言并没有必然的分割,它只与特定的二进制文件格式——Class 文件格式所关联,Class 文件中蕴含了 Java 虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其余辅助信息。
12、多语言混合编程
- Java 平台上的多语言混合编程正成为支流,通过特定畛域的语言去解决特定畛域的问题是以后软件开发应答日趋简单的我的项目需要的一个方向。
- 试想一下,在一个我的项目之中,并行处理用 Clojure 语言编写,展现层应用 JRuby/Rails,中间层则是 Java,每个应用层都将应用不同的编程语言来实现,而且,接口对每一层的开发者都是通明的,各种语言之间的交互不存在任何艰难,就像应用本人语言的原生 API 一样不便,因为它们最终都运行在一个虚拟机之上。
- 对这些运行于 Java 虚拟机之上、Java 之外的语言,来自零碎级的、底层的反对正在迅速加强,以 JSR-292 为外围的一系列我的项目和性能改良(如 DaVinci Machine 我的项目、Nashorn 引擎、InvokeDynamic 指令、java.lang.invoke 包等),推动 Java 虚拟机从 ”Java 语言的虚拟机 ” 向 “ 多语言虚拟机 ” 的方向倒退。
13、本人写个 JVM
- Java 虚拟机非常复杂,要想真正了解它的工作原理,最好的形式就是本人入手编写一个!
- 本人入手写一个 Java 虚拟机,难吗?
- 天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣
14、Java 重大事件
- 1990 年,在 Sun 计算机公司中,由 Patrick Naughton、MikeSheridan 及 James Gosling 领导的小组 Green Team,开发出的新的程序语言,命名为 Oak,前期命名为 Java
- 1995 年,Sun 正式公布 Java 和 HotJava 产品,Java 首次公开亮相。
- 1996 年 1 月 23 日 Sun Microsystems 公布了 JDK 1.0。
- 1998 年,JDK1.2 版本公布。同时,Sun 公布了 JSP/Servlet、EJB 标准,以及将 Java 分成了 J2EE、J2SE 和 J2ME。这表明了 Java 开始向企业、桌面利用和挪动设施利用 3 大畛域挺进。
- 2000 年,JDK1.3 公布,Java HotSpot Virtual Machine 正式公布,成为 Java 的默认虚拟机。
- 2002 年,JDK1.4 公布,古老的 Classic 虚拟机退出历史舞台。
- 2003 年年底,Java 平台的 scala 正式公布,同年 Groovy 也退出了 Java 营垒。
- 2004 年,JDK1.5 公布。同时 JDK1.5 改名为 JavaSE5.0。
- 2006 年,JDK6 公布。同年,Java 开源并建设了 OpenJDK。牵强附会,Hotspot 虚拟机也成为了 OpenJDK 中的默认虚拟机。
- 2007 年,Java 平台迎来了新搭档 Clojure。
- 2008 年,oracle 收买了 BEA,失去了 JRockit 虚拟机。
- 2009 年,Twitter 发表把后盾大部分程序从 Ruby 迁徙到 Scala,这是 Java 平台的又一次大规模利用。
- 2010 年,Oracle 收买了 Sun,取得 Java 商标和最真价值的 HotSpot 虚拟机。此时,Oracle 领有市场占用率最高的两款虚拟机 HotSpot 和 JRockit,并打算在将来对它们进行整合:HotRockit
- 2011 年,JDK7 公布。在 JDK1.7u4 中,正式启用了新的垃圾回收器 G1。
- 2017 年,JDK9 公布。将 G1 设置为默认 GC,代替 CMS
- 同年,IBM 的 J9 开源,造成了当初的 Open J9 社区
- 2018 年,Android 的 Java 侵权案裁决,Google 抵偿 Oracle 计 88 亿美元
- 同年,Oracle 宣告 JavagE 成为历史名词 JDBC、JMS、Servlet 赠予 Eclipse 基金会
- 同年,JDK11 公布,LTS 版本的 JDK,公布革命性的 ZGC,调整 JDK 受权许可
- 2019 年,JDK12 公布,退出 RedHat 领导开发的 Shenandoah GC
15、虚拟机介绍
15.1、虚拟机概念
所谓虚拟机(Virtual Machine),就是一台虚构的计算机。它是一款软件,用来执行一系列虚构计算机指令。大体上,虚拟机能够分为零碎虚拟机和程序虚拟机。
- 赫赫有名的 Virtual Box,VMware 就属于零碎虚拟机,它们齐全是对物理计算机的仿真,提供了一个可运行残缺操作系统的软件平台。
- 程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令咱们称为 Java 字节码指令。
- 无论是零碎虚拟机还是程序虚拟机,在下面运行的软件都被限度于虚拟机提供的资源中。
15.2、Java 虚拟机
- Java 虚拟机是一台执行 Java 字节码的虚构计算机,它领有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成。
- JVM 平台的各种语言能够共享 Java 虚拟机带来的跨平台性、优良的垃圾回器,以及牢靠的即时编译器。
- Java 技术的外围就是 Java 虚拟机(JVM,Java Virtual Machine),因为所有的 Java 程序都运行在 Java 虚拟机外部。
- Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其外部,解释 / 编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机标准中都有具体定义,如怎么取操作数,怎么解决操作数,处理结果放在哪里。
特点:
- 一次编译,到处运行
- 主动内存治理
- 主动垃圾回收性能
16、JVM 的地位
JVM 是运行在操作系统之上的,它与硬件没有间接的交互
Java 的体系结构
17、Java 的整体构造
- HotSpot VM 是目前市面上高性能虚拟机的代表作之一。
- 它采纳 解释器与即时编译器并存的架构。
- 在明天,Java 程序的运行性能早已本性难移,曾经达到了能够和 C /C++ 程序一较高下的境地。
- 执行引擎蕴含三局部:解释器,即时编译器,垃圾回收器
18、Java 代码执行流程
但凡能生成被 Java 虚拟机所能解释、运行的字节码文件,那么实践上咱们就能够本人设计一套语言了
19、JVM 架构模型
Java 编译器输出的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。具体来说:这两种架构之间的区别:
19.1、基于栈的指令集架构
基于栈式架构的特点:
- 设计和实现更简略,实用于资源受限的零碎;
- 避开了寄存器的调配难题:应用零地址指令形式调配
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现
- 不须要硬件反对,可移植性更好,更好实现跨平台
19.2、基于寄存器的指令级架构
基于寄存器架构的特点:
- 典型的利用是 x86 的二进制指令集:比方传统的 PC 以及 Android 的 Davlik 虚拟机。
- 指令集架构则齐全依赖硬件,与硬件的耦合度高,可移植性差
- 性能优良和执行更高效
- 破费更少的指令去实现一项操作
- 在大部分状况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主
19.3、两种架构的举例
同样执行 2 + 3 这种逻辑操作,其指令别离如下:
- * 基于栈的计算流程(以 Java 虚拟机为例):
iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈
- * 而基于寄存器的计算流程
mov eax,2 // 将 eax 寄存器的值设为 1
add eax,3 // 使 eax 寄存器的值加 3
19.4、如何反编译字节码文件
- 编写 java 代码,编译生成字节码文件
public class StackStruTest {public static void main(String[] args) {
int i = 2;
int j = 3;
int k = i + j;
}
}
- 在 .class 文件的同级目录下,执行反编译
javap -v StackStruTest.class
- 反编译失去的指令
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: iconst_2 // 将常量 2 压入栈中
1: istore_1 // 将常量 2 保存至变量 i 中
2: iconst_3 // 将常量 3 压入栈中
3: istore_2 // 将常量 3 保存至变量 j 中
4: iload_1 // 加载变量 i
5: iload_2 // 加载变量 j
6: iadd // 执行累加操作
7: istore_3 // 加法结果保存在变量 k 中
8: return
LineNumberTable:
line 10: 0
line 11: 2
line 12: 4
line 22: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 args [Ljava/lang/String;
2 7 1 i I
4 5 2 j I
8 1 3 k I
}
19.5、JVM 架构总结
- 因为跨平台性的设计,Java 的指令都是依据栈来设计的 。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。 长处是跨平台,指令集小,编译器容易实现,毛病是性能降落,实现同样的性能须要更多的指令
- 时至今日,只管嵌入式平台曾经不是 Java 程序的支流运行平台了(精确来说应该是 HotSpot VM 的宿主环境曾经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?
- 因为基于栈的架构跨平台性好、指令集小,尽管绝对于基于寄存器的架构来说,基于栈的架构编译失去的指令更多,执行性能也不如基于寄存器的架构好,但思考到其跨平台性与移植性,咱们还是选用栈的架构
20、JVM 生命周期
20.1、虚拟机的启动
Java 虚拟机的启动是通过疏导类加载器(bootstrap class loader)创立一个初始类(initial class)来实现的,这个类是由虚拟机的具体实现指定的。
20.2、虚拟机的执行
- 一个运行中的 Java 虚拟机有着一个清晰的工作:执行 Java 程序
- 程序开始执行时他才运行,程序完结时他就进行
- 执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的过程
20.3、虚拟机的退出
有如下的几种状况:
- 程序失常执行完结
- 程序在执行过程中遇到了异样或谬误而异样终止
- 因为操作系统用现谬误而导致 Java 虚拟机过程终止
- 某线程调用 Runtime 类或 System 类的 exit()办法,或 Runtime 类的 halt()办法,并且 Java 平安管理器也容许这次 exit()或 halt()操作。
- 除此之外,JNI(Java Native Interface)标准形容了用 JNI Invocation API 来加载或卸载 Java 虚拟机时,Java 虚拟机的退出状况。
20.4、查看虚拟机过程
- 代码
public class StackStruTest {public static void main(String[] args) {
int i = 2;
int j = 3;
int k = i + j;
try {Thread.sleep(6000);
} catch (InterruptedException e) {e.printStackTrace();
}
System.out.println("hello");
}
}
- 趁程序还在运行的时候,赶快应用 jps 指令查看以后正在运行的过程,图中 23756 为过程所占用的端口号
- StackStruTest 进行执行结束,就查看不到咯
20.5、exit() 办法源码
Runtime 类源码剖析
- Runtime 对象全局惟一,对应着下图中的【运行时数据区】
- 显著的饿汉设计模式:一上来就 new 了一个 Runtime 类的实例,并且将 Runtime 类的结构器私有化了
public class Runtime {private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {return currentRuntime;}
private Runtime() {}
- Runtime 类的 exit() 办法调用了 ShutDown 类的 exit() 办法
public void exit(int status) {SecurityManager security = System.getSecurityManager();
if (security != null) {security.checkExit(status);
}
Shutdown.exit(status);
}
ShutDown 类源码剖析
- exit() 办法会调用到本地办法 runAllFinalizers() 和 halt0()
static void exit(int status) {
boolean runMoreFinalizers = false;
synchronized (lock) {if (status != 0) runFinalizersOnExit = false;
switch (state) {
case RUNNING:
state = HOOKS;
break;
case HOOKS:
break;
case FINALIZERS:
if (status != 0) {halt(status);
} else {runMoreFinalizers = runFinalizersOnExit;}
break;
}
}
if (runMoreFinalizers) {runAllFinalizers();
halt(status);
}
synchronized (Shutdown.class) {sequence();
halt(status);
}
}
static void halt(int status) {synchronized (haltLock) {halt0(status);
}
}
static native void halt0(int status);
private static native void runAllFinalizers();
System 类源码剖析
- System.exit() 办法调用了 Runtime.exit() 办法
public static void exit(int status) {Runtime.getRuntime().exit(status);
}
总结
- 调用 System.exit() 办法 –> 调用 Runtime.exit() 办法
- 调用 Runtime.exit() 办法 –> 调用了 ShutDown.exit() 办法
21、JVM 倒退历程
21.1、Sun Classic VM
- 早在 1996 年 Java1.0 版本的时候,Sun 公司公布了一款名为 sun classic VM 的 Java 虚拟机,它同时也是世界上第一款商用 Java 虚拟机,JDK1.4 时齐全被淘汰。
- 这款虚拟机外部只提供解释器,没有即时编译器,因而效率比拟低,即时编译器会把热点代码缓存起来,那么当前应用热点代码的时候,效率就比拟高。
- 如果应用 JIT 编译器,就须要进行外挂。然而一旦应用了 JIT 编译器,JIT 就会接管虚拟机的执行零碎。解释器就不再工作。解释器和编译器不能配合工作。
- 当初 Hotspot 内置了此虚拟机。
21.2、Exact VM
- 为了解决上一个虚拟机问题,jdk1.2 时,Sun 提供了此虚拟机。
-
Exact Memory Management:精确式内存治理
- 也能够叫 Non-Conservative/Accurate Memory Management
- 虚拟机能够晓得内存中某个地位的数据具体是什么类型。
-
具备古代高性能虚拟机的维形
- 热点探测(寻找出热点代码进行缓存)
- 编译器与解释器混合工作模式
- 只在 Solaris 平台短暂应用,其余平台上还是 classic vm,英雄气短,终被 Hotspot 虚拟机替换
21.3、HotSpot VM
-
HotSpot 历史
- 最后由一家名为 ”Longview Technologies” 的小公司设计
- 1997 年,此公司被 Sun 收买;2009 年,Sun 公司被甲骨文收买。
- JDK1.3 时,HotSpot VM 成为默认虚拟机
-
目前 Hotspot 占有相对的市场位置,称霸武林。
- 不论是当初仍在宽泛应用的 JDK6,还是应用比例较多的 JDK8 中,默认的虚拟机都是 HotSpot
- Sun/oracle JDK 和 openJDK 的默认虚拟机
- 因而本课程中默认介绍的虚拟机都是 HotSpot,相干机制也次要是指 HotSpot 的 GC 机制。(比方其余两个商用虚机都没有办法区的概念)
- 从服务器、桌面到挪动端、嵌入式都有利用。
-
名称中的 HotSpot 指的就是它的热点代码探测技术。
- 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
- 通过编译器与解释器协同工作,在最优化的程序响应工夫与最佳执行性能中获得均衡
21.4、JRockit
- 专一于服务器端利用:它能够不太关注程序启动速度,因而 JRockit 外部不蕴含解析器实现,全副代码都靠即时编译器编译后执行。
- 大量的行业基准测试显示,JRockit JVM 是世界上最快的 JVM:应用 JRockit 产品,客户曾经体验到了显著的性能进步(一些超过了 70%)和硬件老本的缩小(达 50%)。
-
劣势:全面的 Java 运行时解决方案组合
- JRockit 面向提早敏感型利用的解决方案 JRockit Real Time 提供以毫秒或微秒级的 JVM 响应工夫,适宜财务、军事指挥、电信网络的须要
- Mission Control 服务套件,它是一组以极低的开销来监控、治理和剖析生产环境中的应用程序的工具。
- 2008 年,JRockit 被 Oracle 收买。
- Oracle 表白了整合两大优良虚拟机的工作,大抵在 JDK8 中实现。整合的形式是在 HotSpot 的根底上,移植 JRockit 的优良个性。
- 高斯林:目前就任于谷歌,钻研人工智能和水下机器人
21.5、IBM 的 J9
- 全称:IBM Technology for Java Virtual Machine,简称 IT4J,外部代号:J9
- 市场定位与 HotSpot 靠近,服务器端、桌面利用、嵌入式等多用途 VM 宽泛用于 IBM 的各种 Java 产品。
- 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的 Java 虚拟机。
- 2017 年左右,IBM 公布了开源 J9VM,命名为 openJ9,交给 Eclipse 基金会治理,也称为 Eclipse OpenJ9
- OpenJDK -> 是 JDK 开源了,包含了虚拟机
21.6、KVM 和 CDC / CLDC Hotspot
- Oracle 在 Java ME 产品线上的两款虚拟机为:CDC/CLDC HotSpot Implementation VM KVM(Kilobyte)是 CLDC-HI 晚期产品目前挪动畛域位置难堪,智能机被 Android 和 iOS 二分天下。
-
KVM 简略、轻量、高度可移植,面向更低端的设施上还维持本人的一片市场
- 智能控制器、传感器
- 老人手机、经济欠发达地区的性能手机
- 所有的虚拟机的准则:一次编译,到处运行。
21.7、Azul VM
- 后面三大 ” 高性能 Java 虚拟机 ” 应用在通用硬件平台上这里 Azul VW 和 BEA Liquid VM 是与特定硬件平台绑定、软硬件配合的专有虚拟机:高性能 Java 虚拟机中的战斗机。
- Azul VM 是 Azul Systems 公司在 HotSpot 根底上进行大量改良,运行于 Azul Systems 公司的专有硬件 Vega 零碎上的 Java 虚拟机。
- 每个 Azul VM 实例都能够治理至多数十个 CPU 和数百 GB 内存的硬件资源,并提供在微小内存范畴内实现可控的 GC 工夫的垃圾收集器、专有硬件优化的线程调度等优良个性。
- 2010 年,Azul Systems 公司开始从硬件转向软件,公布了本人的 Zing JVM,能够在通用 x86 平台上提供靠近于 Vega 零碎的个性。
21.8、Liquid VM
- 高性能 Java 虚拟机中的战斗机。
- BEA 公司开发的,间接运行在自家 Hypervisor 零碎上
- Liquid VM 即是当初的 JRockit VE(Virtual Edition)
- Liquid VM 不须要操作系统的反对,或者说它本人自身实现了一个专用操作系统的必要性能,如线程调度、文件系统、网络反对等。
- 随着 JRockit 虚拟机终止开发,Liquid vM 我的项目也进行了。
21.9、Apache Marmony
- Apache 也已经推出过与 JDK1.5 和 JDK1.6 兼容的 Java 运行平台 Apache Harmony。
- 它是 IElf 和 Intel 联合开发的开源 JVM,受到同样开源的 Open JDK 的压抑,Sun 坚定不让 Harmony 取得 JCP 认证,最终于 2011 年服役,IBM 转而参加 OpenJDK
- 尽管目前并没有 Apache Harmony 被大规模商用的案例,然而它的 Java 类库代码吸纳进了 Android SDK。
21.10、Micorsoft JVM
- 微软为了在 IE3 浏览器中反对 Java Applets,开发了 Microsoft JVM。
- 只能在 window 平台下运行。但确是过后 Windows 下性能最好的 Java VM。
- 1997 年,Sun 以进犯商标、不正当竞争罪名指控微软胜利,赔了 Sun 很多钱。微软 WindowsXP SP3 中抹掉了其 VM。当初 Windows 上装置的 jdk 都是 HotSpot。
21.11、Taobao JVM
- 由 AliJVM 团队公布。阿里,国内应用 Java 最弱小的公司,笼罩云计算、金融、物流、电商等泛滥畛域,须要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
- 基于 OpenJDK 开发了本人的定制版本 AlibabaJDK,简称 AJDK。是整个阿里 Java 体系的基石。
-
基于 OpenJDK Hotspot VM 公布的国内第一个优化、深度定制且开源的高性能服务器版 Java 虚拟机。
- 翻新的 GCIH(GCinvisible 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 利用在阿里产品上性能高,硬件重大依赖 inte1 的 cpu,损失了兼容性,但进步了性能
- 目前曾经在淘宝、天猫上线,把 Oracle 官网 JvM 版本全副替换了。
21.12、Dalvik VM
- 谷歌开发的,利用于 Android 零碎,并在 Android2.2 中提供了 JIT,倒退迅猛。
- Dalvik VM 只能称作虚拟机,而不能称作 ”Java 虚拟机 ”,它没有遵循 Java 虚拟机标准
- 不能间接执行 Java 的 Class 文件
- 基于寄存器架构,不是 jvm 的栈架构。
- 执行的是编译当前的 dex(Dalvik Executable)文件。执行效率比拟高。
- 它执行的 dex(Dalvik Executable)文件能够通过 class 文件转化而来,应用 Java 语法编写应用程序,能够间接应用大部分的 Java API 等。
- Android 5.0 应用反对提前编译(Ahead of Time Compilation,AoT)的 ART VM 替换 Dalvik VM。
21.13、Graal VM
- 2018 年 4 月,Oracle Labs 公开了 GraalvM,号称 “Run Programs Faster Anywhere”,勃勃野心。与 1995 年 java 的 ”write once,run anywhere” 一唱一和。
- GraalVM 在 HotSpot VM 根底上加强而成的跨语言全栈虚拟机,能够作为 ” 任何语言 ”
的运行平台应用。语言包含:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R 等
- 反对不同语言中混用对方的接口和对象,反对这些语言应用曾经编写好的本地库文件
- 工作原理是将这些语言的源代码或源代码编译后的两头格局,通过解释器转换为能被 Graal VM 承受的两头示意。Graal VM 提供 Truffle 工具集疾速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,取得比原生编译器更优良的执行效率。
- 如果说 HotSpot 有一天真的被取代,Graalvm 心愿最大。然而 Java 的软件生态没有丝毫变动。
21.14、总结
具体 JVM 的内存构造,其实取决于其实现,不同厂商的 JVM,或者同一厂商公布的不同版本,都有可能存在肯定差别。次要以 Oracle HotSpot VM 为默认虚拟机。
你只管学习,我来负责记笔记???? 关注公众号!, 更多笔记,等你来拿,谢谢