JVM - 1. Java虚拟机梗概,那些你不知道的VM

虚拟机梗概

JDK

Java程序设计语言、 Java虚拟机、 Java API类库这三部分统称为JDK(Java Development
Kit),JDK是用于支持Java程序开发的最小环境

JRE

Java API类库中的JavaSE API子集、Java虚拟机这两部分统称为JRE(Java Runtime
Environment),JRE是支持Java程序运行的标准环境

(Java技术体系中所包含的内容)

JVM - 1. Java虚拟机梗概,那些你不知道的VM_第1张图片

技术服务领域

可以划分为以下四种

Java Card

支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。

Java ME(Micro Edition)

支持Java程序运行在移动终端(手机、 PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。

Java SE(Standard Edition)

支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。

Java EE(Enterprise Edition)

支持使用多层架构的企业应用(如ERP、 CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充[3]并提供了相关的部署支持,以前称为J2EE

众多虚拟机

Sun Classic

第一款商用虚拟机,纯解释器的方式执行java代码,当然可以选择外挂一个JIT编译器来工作。
由于解释器和编译器不能配合工作, 这就意味着如果要使用编译器执行
编译器就不得不对每一个方法、 每一行代码都进行编译
无论它们执行的频率是否具有编译的价值
基于程序响应时间的压力, 这些编译器根本不敢应用编译耗时稍高的优化技术
因此这个阶段的虚拟机即使用了JIT编译器输出本地代码, 执行效率也和传统的C/C++程序有很大差距

Exact VM

一个短暂存在的为了解决Classic存在的,基本具备现代虚拟机的特性,编译器之间与解释器的混合工作模式,以及准确的内存管理而成名。
例如一个32位整数,虚拟机知道他是引用类型指向的一个内存地址,还是一个数值为X的整数。这样就可以准确的进行GC管理。
Exact还未发行windows / linux版本即被未来更优秀的HotSpot取代。

Sun HotSpot VM

C:\Users\Administrator>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)

HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码, 然后通知JIT编译器以方法为单位进行编译。
如果一个方法被频繁调用, 或方法中有效循环次数很多, 将会分别触发标准编译和OSR( 栈上替换) 编译动作。
通过编译器与解释器恰当地协同工作, 可以在最优化的程序响应时间与最佳执行性能中取得平衡, 即时编译的时间压力也相对减小
@@>>>OSR栈上替换和标准编译
@@>>>热点代码探测
@@>>>解释器与编译器

Sun Mobile-Embedded VM/Meta-Circular VM

Sun公司研发的众多虚拟机中有一部分是面向研究,验证观点或一些陌生的标准规范以及特殊领域的存在

KVM

“Android ios 出现前在手机平台中曾得到广泛应用”

CDC/CLDC HotSpot Implementation

“希望规范手机,电子书,pad等设备中的java接口规范,但是现不容乐观”

Squawk VM

“运行在sum spot(一种手持小型wifi设备),其中除了i/o和非必要的本地代码外基本都是用java实现”

JavaInJava

“实验性项目,目的是用java来实现java vm,达成“元循环”的思想,内部没有编译器只能依赖解模式执行,性能问题未得到解决”

Maxine VM

“可以理解为带有JIT编译器的JavaInJava性能接近Hotspot,仍在发展中”

BEA JRockit/IBM J9 VM

JRockit 无解释器,全依赖即时编译执行。其为专门为服务器硬件和服务器应用场景优化的虚拟机,专注服务器端应用,对启动不太关注。
J9 一款多用途商用的IBM虚拟机,主要针对IBM WebSphere等IBM产品

Azul VM/BEA Liquid VM

Azul是Hotspot针对Azul公司专有硬件Vega系统而优化的硬件平台虚拟机
Liquid则是BEA针对自家Hypervisor系统上JRockit的虚拟化版本,自身成为系统直接控制硬件最大效能发挥能力。

64位JDK

Java程序运行在64位虚拟机上需要付出比较大的额外代价:
内存问题, 由于指针膨胀(更宽的寻址)和各种数据类型对齐补白的原因, 通常要比32位系统额外增加10%~ 30%的内存消耗
机构的测试结果显示, 64位虚拟机的运行速度在各个测试项中几乎全面落后于32位虚拟机, 两者大约有15%左右的性能差距
在Java EE方面, 企业级应用经常需要超过4GB的内存, 对于64位虚拟机的需求是非常迫切的
在JDK 1.6 Update 14之后, 提供了普通对象指针压缩功能
@@>>>指针压缩

你可能感兴趣的:(总结,Java)