1、开发人员如何看待上层技术:
一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。
2、我们为什么要学习JVM?
面试的需要(BATJ、TMD、PKQ等面试都爱问)
中高级程序员必备技能
项目管理、调优的需要
追求极客的精神
垃圾回收算法、JIT、底层原理
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
3、学习内容:
- JVM与Java体系结构
- 类加载子系统-修改
- 运行时数据区概述及线程
- 程序计数器
- 虚拟机栈
- 本地方法接口
- 本地方法栈
- 堆
- 方法区
- 直接内存
- 执行引擎
- StringTable
- 垃圾回收概述
- 垃圾回收相关算法
- 垃圾回收相关概念
- 垃圾回收器
推荐书籍:深入理解java虚拟机,周
4、java生态圈
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
作为一个平台,
Java虚拟机扮演着举足轻重的作用。Groovy、 Scala、JRuby、Kotlin等都是Java平台的一部分·
作为一种文化,
Java几乎成为了 “开源”的代名词。第三方开源软件和框架。如Tomcat、Struts,MyBatis,Spring等。就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Harmony。
作为一个社区,
Java拥有全世界最多的技术拥护者和开源社区支持有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。
5、JVM:跨语言的平台
随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。
IJava虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
6、字节码
·我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。·不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
·Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。
7、多语言混合编程
Java平台上的多语言混合编程正成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。
试想一下,在一个项目之中,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为它们最终都运行在一个虚拟机之上。
对这些运行于Java虚拟机之上、Java之外的语言,来自系统级的、底层的支持正在迅速增强,以JSR-292为核心的一系列项目和功能改进(如DaVinci Machine项目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),推动Java虚拟机从“Java语言的虚拟机”向“多语言虚拟机”的方向发展。
8、虚拟机
(Virtual Machine),就是一台虚拟的计算机它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
大名鼎鼎的Visual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
java虚拟机
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
·JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
·Java技术的核心就是Java虚拟机(JVM, Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。
·作用
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
·特点
一次编译,到处运行
自动内存管理
自动垃圾回收功能
9、jvm的位置
10、jdk。jre,和jvm的关系
在Java开发中,"JDK"(Java Development Kit)、"JRE"(Java Runtime Environment)和"JVM"(Java Virtual Machine)是三个重要的概念,它们之间有着密切的关系:
-
JVM(Java Virtual Machine):
- JVM是Java应用程序运行的虚拟机器,它是Java的核心,负责将Java字节码(.class文件)翻译成特定平台的机器码来执行。
- JVM的作用是提供了一个虚拟的计算环境,使得Java程序可以在不同的操作系统和硬件平台上运行,实现了Java的"一次编写,到处运行"的特性。
- JVM负责内存管理、垃圾回收、线程管理等任务,为Java程序提供了一个可靠且高效的运行环境。
-
JRE(Java Runtime Environment):
- JRE包含了Java运行时环境的核心文件,包括JVM和Java的核心类库。
- 当你要运行Java程序时,至少需要安装JRE,因为它提供了Java应用程序运行所需的环境。
- JRE主要是为了运行Java程序而设计的,如果你只想运行Java应用程序而不需要进行开发,那么安装JRE就足够了。
-
JDK(Java Development Kit):
- JDK是Java开发工具包,它包含了Java开发所需的工具,包括JRE、编译器(javac)、调试器(jdb)、Java文档生成器(javadoc)等。
- JDK除了包含JRE的所有内容外,还包含了用于开发Java程序的工具和库。
- 如果你要进行Java的开发工作,包括编写、编译、调试Java程序,那么你需要安装JDK。
简单来说,JVM是Java程序的运行环境,JRE包含了JVM和核心类库用于运行Java程序,而JDK则是包含了JRE以及用于Java开发的工具和库。在开发Java应用程序时,需要安装JDK;而在仅需运行Java程序时,只需安装JRE即可。
11、JVM的整体结构
. HotSpot VM是前市面上高性能虚拟机的代表作之一。
·它采用解释器与即时编译器并存的架构。
·在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。
12、java代码执行流程
jvm解释执行和编译执行
在Java中,JVM(Java Virtual Machine)可以使用两种不同的执行方式:解释执行(Interpreted Execution)和编译执行(Just-In-Time Compilation)。
-
解释执行(Interpreted Execution):
- 在解释执行中,JVM会逐行地读取Java源代码,并将其转换为对应的机器码,然后立即执行。
- 这意味着每次运行代码时,JVM都会重新解释并执行相同的代码,不会生成可重复使用的本地机器码。
- 解释执行的优点是简单快速,因为不需要等待代码的编译过程,可以立即执行。然而,由于没有编译为本地机器码,它的执行速度可能会比较慢。
-
编译执行(Just-In-Time Compilation):
- 在编译执行中,JVM会将Java字节码(.class文件)在运行时动态地编译为本地机器码,然后执行这些本地机器码。
- 这种方式下,JVM会监视运行时的代码,并将频繁执行的代码块编译为本地机器码,以提高执行效率。
- 通常,JVM会使用即时编译器(Just-In-Time Compiler,JIT)来执行这种编译过程,将部分代码编译为本地机器码后再执行,而不是一开始就全部编译。
对比两种执行方式:
- 解释执行的优点是可以立即执行,无需等待编译过程,但缺点是执行速度可能相对较慢。
- 编译执行的优点是能够将代码编译为本地机器码,提高了执行效率,但缺点是首次执行时可能会有一些延迟,因为需要先进行编译。
事实上,现代的JVM通常会结合两种执行方式,使用解释执行进行快速启动和执行,同时使用即时编译器(JIT)对代码进行动态编译,以提高执行效率。这样就兼顾了两种方式的优点,即时编译器可以根据代码的执行情况动态地优化,以达到更好的性能表现。
java源码编译成为字节码的过程
将Java源代码编译成字节码(Bytecode)是Java程序的第一步,这个过程通常包括以下几个步骤:
-
编写Java源代码:
- 首先,程序员编写Java源代码,这些代码通常保存在以".java"为扩展名的文本文件中。
-
使用编译器编译Java源代码:
- 使用Java编译器(javac)将Java源代码文件编译成字节码文件。
- 在命令行中,可以使用如下命令进行编译:
javac YourJavaFile.java
编译器会进行语法检查和类型检查等操作,如果源代码中存在错误,编译器会提示错误信息。
-
生成字节码文件:
- 如果编译器没有发现错误,它会生成对应的字节码文件。
- 字节码文件以".class"为扩展名,包含了Java源代码的中间表示形式。
- 这些字节码文件包含了与特定平台无关的指令集,可以在任何支持Java虚拟机(JVM)的平台上运行。
-
字节码文件结构:
- 字节码文件包含了类的结构、方法、字段、常量池等信息,以及指令集合。
- 这些指令是一种与特定平台无关的中间表示形式,类似于汇编语言,但比汇编语言更高级。
-
运行Java字节码:
- 一旦有了字节码文件,就可以在任何安装了JRE(Java Runtime Environment)的平台上运行Java程序。
- 使用命令行运行Java程序,可以使用如下命令:
java YourClass
-
- 其中,"YourClass"是包含主方法(main方法)的Java类的名称,这个类会被JVM加载并执行。
-
总的来说,Java源代码经过编译器编译成字节码文件后,就变成了与特定平台无关的中间表示形式。这些字节码文件可以在任何安装了Java虚拟机(JVM)的平台上运行,实现了Java的"一次编写,到处运行"的特性。
将高级语言编译成字节码(如Java编译成字节码)与将高级语言编译成汇编语言然后再汇编成机器语言(Assembly编译成机器码)有一些相似之处,也有一些不同之处。
相似之处:
-
中间表示形式:
- 在两种情况下,高级语言都被编译成了一种中间表示形式。
- Java编译成字节码(.class文件),这是一种与特定平台无关的中间表示形式。
- 高级语言编译成汇编语言,然后汇编成机器码,也是一种在特定平台上运行的中间表示形式。
-
可移植性:
- 在两种情况下,生成的中间表示形式都具有一定的可移植性。
- Java的字节码可以在任何安装了JVM的平台上运行,实现了跨平台的特性。
- 生成的汇编代码也可以在特定平台的汇编器(Assembler)上汇编成对应平台的机器码。
不同之处:
-
编译过程:
- Java编译成字节码的过程通常是一步到位的,即直接从Java源代码到字节码。
- 而将高级语言编译成汇编语言,然后再汇编成机器码的过程是多步的,需要经过两次编译过程。
-
跨平台性:
- Java字节码的跨平台性是由JVM实现的,它在不同平台上解释执行字节码。
- 汇编语言编译成机器码后,生成的机器码是特定平台上的可执行文件,不具备跨平台性。
-
执行方式:
- Java字节码在运行时会由JVM解释执行或者进行即时编译执行(JIT)。
- 生成的机器码是直接在硬件上执行的,不需要解释器或虚拟机。
虽然Java编译成字节码和高级语言编译成汇编语言再汇编成机器码都涉及到中间表示形式的生成,但Java字节码更强调跨平台性和JVM的执行环境,而汇编语言则更接近底层硬件执行的机器码。
12、JVM的架构模型:
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构
具体来说:这两种架构之间的区别:
·基于栈式架构的特点
设计和实现更简单,适用于资源受限的系统;
避开了寄存器的分配难题:使用零地址指令方式分配。
指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。
指令集更小,编译器容易实现。
不需要硬件支持,可移植性更好,更好实现跨平台
基于寄存器架构的特点
典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。
指令集架构则完全依赖硬件,可移植性差
性能优秀和执行更高效;
花费更少的指令去完成一项操作。
在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。
零地址指令多地址指令
在计算机体系结构中,指令集架构(Instruction Set Architecture,ISA)中的指令可以根据其操作数的数量和位置进行分类。两种常见的指令格式是零地址指令和多地址指令。
零地址指令(Zero-Address Instructions):
-
定义:零地址指令是指那些不需要明确指定操作数位置的指令。也就是说,这些指令从栈顶或者其他类似的位置获取操作数,并将结果返回到相同的位置。
-
操作数:这种指令格式不显式地指定操作数的位置,而是通过隐式的方式从栈顶或寄存器堆栈中取得操作数。
-
优点:
- 简洁:指令本身非常紧凑,因为不需要为每个操作数指定位置。
- 对寄存器的使用较少:不需要大量的寄存器,因为操作数通常存在栈顶。
-
缺点:
- 可读性差:因为操作数的位置不明显,需要通过文档或者上下文来理解。
- 灵活性受限:对于复杂的操作,可能无法用零地址指令来表达。
示例:栈式计算机中的指令可以视为零地址指令,如下所示:
PUSH 5 // 将5推入栈顶
PUSH 3 // 将3推入栈顶
ADD // 从栈顶弹出两个数相加,并将结果推入栈顶
多地址指令(Multiple-Address Instructions):
-
定义:多地址指令是指那些需要显式指定多个操作数位置的指令。每个操作数都有明确的地址或标识符。
-
操作数:每个操作数都需要明确指定其位置或者地址,通常存储在寄存器、内存或者其他位置。
-
优点:
- 可读性强:指令中明确指定了操作数的位置,易于理解和调试。
- 灵活性强:可以支持复杂的操作,因为每个操作数的位置都是可配置的。
-
缺点:
- 指令长度可能较长:因为需要为每个操作数指定地址或标识符。
- 对寄存器的需求增加:每个操作数都需要一个寄存器或者其他存储位置。
示例:x86架构中的指令就是多地址指令,如下所示:
MOV AX, 5 // 将5移动到寄存器AX
MOV BX, 3 // 将3移动到寄存器BX
ADD AX, BX // 将寄存器AX和BX中的值相加,结果存入AX
总的来说,零地址指令不需要明确指定操作数的位置,而是通过隐式的方式从栈顶或其他位置获取操作数。多地址指令则需要显式地指定每个操作数的位置或者地址,因此更易于理解和调试,但可能需要更多的指令空间和寄存器。
总结:
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?
-
历史原因:
- Java最初的设计目标之一是实现跨平台的能力,使得一次编写的 Java 代码可以在不同的平台上运行。而基于栈的架构更容易实现这种跨平台性。
- 在 Java 被设计时,基于栈的虚拟机(如JVM)可以更容易地将字节码(Bytecode)翻译为不同平台的本地指令。因为基于栈的指令集更为简单,并且更容易适应不同的硬件架构。
-
跨平台性:
- 基于栈的架构使得 Java 字节码可以更容易地在不同的操作系统和硬件上运行。因为 Java 字节码是针对虚拟机的中间表示,而不是直接对应特定硬件的机器码。
- 如果使用基于寄存器的架构,需要为每种不同的硬件架构重新设计和实现虚拟机,这会增加开发和维护的复杂性。
-
内存管理和垃圾回收:
- 基于栈的架构更容易进行内存管理和垃圾回收。在栈上分配内存是一个很简单的过程,而且可以很容易地执行自动的垃圾回收。
- 相比之下,基于寄存器的架构可能需要更复杂的内存管理机制,包括显式地分配和释放寄存器中的内存。
-
运行效率:
- 尽管基于栈的架构在某些情况下可能会比基于寄存器的架构运行速度稍慢,但现代的 Java 虚拟机实现已经进行了大量的优化。
- 当前的 HotSpot JVM 和其他优化的 JVM 实现在运行 Java 程序时通常具有很好的性能,这使得基于栈的架构成为一个有效的选择。
-
现有的生态系统:
- Java 已经建立了庞大的生态系统,有大量的库和工具可以使用。如果改变虚拟机的架构,将会对这些现有的代码和工具造成很大的影响。
- 更换架构意味着需要重新设计和重新实现大量的基础设施,这是一个巨大的工程,而且可能会导致不可预测的后果。
综上所述,尽管基于栈的架构并不是没有缺点,但基于历史原因、跨平台性、内存管理和垃圾回收的便利性、运行效率以及现有生态系统的考虑,Java 仍然选择保持基于栈的架构作为其虚拟机的基础。同时,现代的 JVM 实现也在不断地进行优化和改进,以提高性能和运行效率。
栈:跨平台性、指令集小、指令多;执行性能比寄存器差
13、JVM的生命周期
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
·一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
·程序开始执行时他才运行,程序结束时他就停止。
·执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
虚拟机的退出有如下的几种情况:
·程序正常执行结束·程序在执行过程中遇到了异常或错误而异常终止
·由于操作系统出现错误而导致Java虚拟机进程终止
·某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
·除此之外,JNI(Java Native Interface)规范描述了用JNIInvocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况。
14、JVM发展历程
Sun Classic VM
·早在1996年Java1.0版本的时候,Sun公司发布了一款名为SunClassicVM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。
·这款虚拟机内部只提供解释器。
·如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
·现在hotspot内置了此虚拟机。
Exact VM
·为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。
. Exact Memory Management:准确式内存管理
>也可以叫Non-Conservative/Accurate Memory Management
>虚拟机可以知道内存中某个位置的数据具体是什么类型。
具备现代高性能虚拟机的雏形
>热点探测
>编译器与解释器混合工作模式
只在Solaris平台短暂使用,其他平台上还是classic vm
英雄气短,终被Hotspot虚拟机替换
SUN公司的 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指的就是它的热点代码探测技术。
通过计数器找到最具编译价值代码,触发即时编译或栈上替换
通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡
BEA的JRockit(专注于服务端)
专注于服务器端应用
它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行。
大量的行业基准测试显示,JRockitJVM是世界上最快的 J V M
使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了708)和硬件成本的减少(达508)。
·优势:全面的Java运行时解决方案组合
JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
MissionControl服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。
·2008年,BEA被Oracle收购。
·Oracle表达了整合两大优秀虚拟机的工作,大致在JDK8中完成。整合的方式是在HotSpot的基础上,移植JRockit的优秀特性。
·高斯林:目前就职于谷歌,研究人工智能和水下机器人BEA JRockit
IBM的J9(通用性很差)
·全称: IBM Technology for Java Virtual Machine,简称IT4J,内部代号::J9
·市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM
·广泛用于IBM的各种Java产品。(用于IBM自家产品时稳定快速,用于其他家产品有待商榷)
·目前,有影响力的三大商用服务器之一,也号称是世界上最快的Java虚拟机。
·2017年左右,IBM发布了开源J9VM,命名为OpenJ9,交给Eclipse基金会管理,也称为 Ecilpse OpenJ9
KVM和CDC/CLDC HotspotI
·Oracle在Java ME产品线上的两款虚拟机为:CDC/CLDC HotSpotImplementation VM.KVM(Kilobyte)是CLDC-HI早期产品·目前移动领域地位尴尬,智能手机被Android和iOS二分天下。
·KVM简单、轻量、高度可移植,面向更低端的设备上还维持自己的一片市场。
>智能控制器、传感器
老人手机、经济欠发达地区的功能手机
·所有的虚拟机的原则:一次编译,到处运行。
Azul VM(与特定硬件平台绑定、软硬件配合的专有虚拟机)
·前面三大“高性能Java虚拟机”使用在通用硬件平台上
·这里AzulVM和BEALiquidVM是与特定硬件平台绑定、软硬件配合的专有虚拟机。
高性能Java虚拟机中的战斗机。
·AzulVM是Azul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机。
·每个AzulVM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、专有硬件优化的线程调度等优秀特性。
·2010年,Azul Systems公司开始从硬件转向软件,发布了自己的zingJVM,可以在通用x86平台上提供接近于Vega系统的特性。
Liquid VM(了解就行,应用场景有限)
·高性能Java虚拟机中的战斗机。
·BEA公司开发的,直接运行在自家Hypervisor系统上.
Liquid VM即是现在的JRockit VE (Virtual Edition), LiquidVM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如线程调度、文件系统、网络支持等。
·随着JRockit虚拟机终止开发,LiquidVM项目也停止了。
Apache Harmony(了解)
Apache也曾经推出过与JDK1.5和JDK1.6兼容的Java运行平台Apache Harmony.
·它是IBM和Intel联合开发的开源JVM,受到同样开源的OpenJDK的压制,Sun坚决不让Harmony获得JCP认证,最终于2011年退役,IBM转而参与OpenJDK
·虽然目前并没有Apache Harmony被大规模商用的案例,但是它的Java类库代码吸纳进了Android SDK。
Microsoft JVM
·微软为了在IE3浏览器中支持Java Applets,开发了Microsoft JVM。
·只能在window平台下运行。但确是当时Windows下性能最好的Java VM。
·1997年,Sun以侵犯商标、不正当竞争罪名指控微软成功,赔了sun很多钱。微软在WindowsXP SP3中抹掉了其VM。现在windows上安装的jdk都是HotSpot。
TaobaoJVM
·由AliJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
·基于OpenJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。基于OpenJDK HotSpotVM发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机。
创新的GCIH(GC invisible heap)技术实现了,即将生命周期较长的Java对象从heap中移到heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。
GCIH中的对象还能够在多个Java虚拟机进程中实现共享
使用crc32指令实现JVMintrinsic降低JNI的调用开销
PMU hardware 的Java profiling tool 和诊㫁协助功能
针对大数据场景的ZenGCt
aobao vm应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能
目前已经在淘宝、天猫上线,把Oracle官方JVM版本全部替换了。