【学习笔记】Java虚拟机(一)概论
一、Java体系
1、按功能划分(官方定义)
① Java程序设计语言
② 各种硬件平台上的Java虚拟机
③ Class文件格式
④ Java API类库
⑤ 来自商业机构和开源社区的第三方Java类库
其中①②④统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境;②和
④中的Java SE API子集统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标
准环境。借图:
2、按业务划分
① Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台
② Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台
③ Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用)的Java平台
④ Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的
Java平台
二、Java虚拟机
1、Sun Classic/Exact VM
Sun Classic是世界上第一款商用Java虚拟机,基于handler对象查找内存数据,只能外挂JIT编译器
,并且编译器与解释器不可协同工作,运行效率低下。
Exact VM可以支持编译、解释混合工作模式,使用准确式内存管理(Exact Memory Management
,虚拟机可以知道内存地址对应的数据类型具体是什么,方便GC时判断堆上数据是否可用,而且在
GC整理后不需要使用句柄保持reference值的稳定,减少了一次查找对象的开销,提升了执行性能。
2、Sun HotSpot VM
Sun HotSpot VM是Sun JDK和OpenJDK所带的虚拟机,它的名称指的就是热点代码探测技术,此技
术可以通过执行计数器找出最具有编译价值的代码,然后通知JIT以方法为单位编译代码。如果一个
方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作
,无需等待本地代码输出才能执行程序,即使编译的时间压力相对减小。
3、Sun Mobile-Embedded VM/Meta-Circular VM
① KVM
简单、轻量、高度可移植、运行速度慢,曾经在手机平台广泛应用
② CDC/CLDC HotSpot Implementation
全称Connected(Limited)Device Configuration,在JSR-139/JSR-218规范中定义,目的
是在手机、电子书、 PDA等设备上建立统一的Java编程接口,是Jave ME的重要支柱
③ Squawk VM
运行于Sun SPOT(Sun Small Programmable Object Technology,一种手持wifi设备),也
曾经运行于Java Card。Squawk VM除了设备I/O和必要的本地代码使用了C语言,剩下的均
由Java语言完成
④ JavaInJava
JavaInJava试图使用Java语言来实现Java语言的运行环境,即“元循环”(Meta-Circular),
其必须运行在宿主虚拟机上,内部没有JIT编译器,代码只能以解释模式执行
⑤ Maxine VM
与JavaInJava类似,除了用于启动JVM的加载器使用了C语言,剩下的全部使用Java实现,它
有JIT编译器和垃圾收集器(没有解释器),可在宿主模式或独立模式下执行,执行效率接近
了Sun HotSpot VM的水平
4、BEA JRockit/IBM J9 VM
JRockit是一款专门为服务器硬件和服务器应用场景高度优化的虚拟机,不太关注程序启动速度,所
以内部不包含解释器,全部代码靠即时编译器编译后执行。
IBM J9定位与Sun HotSpot类似,主要市场是和IBM产品(如IBM WebSphere)搭配的以及在IBM
AIX和z/OS这些平台上部署的Java应用
5、Azul VM/BEA Liquid VM
他们都是特定硬件平台专有的虚拟机。
Azul VM基于Sun HotSpot大量改进,运行于Azul System公司专有的硬件Vega系统上,每个Azul
VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的
GC时间的垃圾收集器。
Liquid VM就是现在的JRockit VE(Virtual Edition),可以直接运行在自家Hypervisor系统上的
JRockit VM的虚拟化版本,本身实现了操作系统的必要功能,如文件系统、网络支持等,由虚拟机
越过操作系统直接控制硬件,最大限度发挥了硬件的能力,提升Java程序的性能
6、Apache Harmony/Google Android Dalvik VM
他们只能叫虚拟机,并不能成为Java虚拟机。
Apache Harmony是以Apache License协议开源的程序平台,包含虚拟机和Java库,可以运行
Ecpilse、Tomcat、Maver等Java程序,但没有通过TCK认证(Technology Compatibility Kit)的
兼容性测试
Dalvik VM是Android平台的核心组成部分之一,他没有遵循Java虚拟机规范,不能执行Java和Class
文件,使用了寄存器架构而不是JVM常见的架构,但他执行的dex(Dalvik Executable)文件可以通
过Class文件转化而来,并使用Java语法编写应用程序,可以使用大部分Java API,在Android2.2中
已经提供了即时编译器的实现
7、Microsoft JVM及其他
微软为了在IE3中支持Java Applets应用而开发了自己的Java虚拟机,且只有Windows版本
其他:Jam VM、cacaovm、Sable VM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM、
Jikes RVM
三、Java发展
1、模块化
2007年Sun提出了JSR-277:Java模块系统(Java Module System),在Java SE7再次提交JSR-
294:Java编程语言中的改进模块性支持(Improved Modularity Support in the Java
Programming Language)。并在OpenJDK里成立Jigsaw(拼图)子项目推动该规范
2、混合语言
Clojure、JRuby、Groovy等新生语言的使用人数不断增长,通过特定领域的语言解决特定领域的问
题是当前软件开发的一个方向,很多语言都有了JVM实现版本。借图:
3、多核并行
Fork/Join模式事处理并行编程的一个经典方法。函数式编程也适合并行运行,Lambda可以极大改善
Java对函数式编程的支持。显卡的算术运算能力、并行能力已经远超过CPU,Sumatra项目就是为
Java提供使用GPU(Graphics Processing Units)和APU(Accelerated Processing Units)运算能
力的工具,以后它将直接提供Java语言层面的API,或为Lambda和其他JVM语言提供底层的并行运
算支持
4、丰富语法
Java5中曾扩充里自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环等语法,Sun专门为改
进Java语法在OpenJDK中还建立了Coin子项目来统一对Java语法的细节改进,如二进制数的原生支
持、switch语句中支持字符串、“<>”操作符、异常处理的改进、简化变长参数方法调用、面向资源
的try-catch-finally语句等。JSR-335(Lambda Expressions for the Java ™ Programming
Language)中定义的Lambda表达式也可能让面向函数方式的编程成为主流
5、64位虚拟机
Java虚拟机运行在64位虚拟机上需要付出额外的代价:首先是由于指针膨胀和各种数据类型对齐补
白导致Java需要消耗更多的内存,通常比32位系统增加10%-30%,其次多个测试表明,64位虚拟
机各个测试速度均落后于32位虚拟机,大概有15%的性能差距。Sun在JDK1.6中提供了普通对象指针
压缩功能(-XX:+UseCompressedOops),在执行代码时可动态植入压缩指令以节省内存开销,
但所有堆内或指向堆内的对象以及对象实例指向对象的指针都会被压缩,增加执行代码数量