世界上没有最好的语言,只有最适用于具体应用场景的编程语言
为什么要学习JVM
面试的需要
中高级程序员必备技能
准备极客精神
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 官方虚拟机手册
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java也早已不再是是一个门编程需要了,它更是一个平台、一种文化、一个社区
作为一个平台,Java虚拟机扮演者举足轻重的作用
作为一种文化,Java几乎成为可“开源”的代名词
作为社区,Java拥有世界最多的技术拥护者和开源社区的支持。从桌面应用软件、嵌入式开发到企业级应用、后台服务、中间件都可以看到Java的身影
Java虚拟机是Java平台的基石。它是技术的组成部分,负责硬件和操作系统的独立性,编译代码的小巧大小以及保护用户免受恶意程序侵害的能力。
Java虚拟机是抽象的计算机。像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。使用虚拟机实现编程语言是相当普遍的。
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.2
Java不是最强大的语言,但是JVM是最强大的虚拟机。
Java平台上的多语言混合编程正成为,通过特定的语言决绝特定领域的问题是当前软件因公日趋复杂项目需求的一个方向。
各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样,因为它们最终都运行在一个虚拟机上面。
推动Java虚拟机从“Java语言的虚拟机”向“多语言虚拟机”的方向发展
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式 .
Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType .
Oracle的项目发布经理Joe Darcy在OSCON 2011上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译的OpenJDK,基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。
那么到底什么是OpenJDK
历史上的原因是,OpenJDK是JDK的开放源码版本,以GPL协议的形式发布。(General Public License)在JDK7的时候,OpenJDK已经成为JDK7的主干开发版,SUN JDK7是在OpenJDK7的基础上发布的,其大部分源码都相同,只有少部分源码被替换掉。使用JRL(Java Research License,Java研究授权协议)发布。
关于JDK和OpenJDK的区别,可以归纳为以下几点
OpenJDK采用GPL V2协议发布,而JDK则采用JRL协议发布。两个协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。
OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
在JDK11之前,OracleJDK中还会存在一些OpenJDK中没有的、闭源的功能。但在JDK11中,可以认为OpenJDK和OracleJDK代码实质上已经完全一致。
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机
无论是系统虚拟机还是程序虚拟机,在上面运行写软件都被限制于虚拟机提供的资源中
java虚拟机是一台执行java字节码的虚拟计算机,它拥有独立的运行几支笔,其运行的Java字节码也未必由java编译完成的
JVM平台的各种语言可以共享java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
java技术的可信就是Java虚拟机,因为所有的java程序都运行在java虚拟机内部。
作用
java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台的机器指令。每一条java指令,java虚拟机规范中都有详细的定义,如怎么去操作数,怎么处理操作数,处理结果放在那里
特点
JVM是运行在操作系统之上的,它与硬件没有直接交换
Java编译器输入的指令流基本是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
Hotspot VM 寄存器就是PC寄存器
总结
由于跨平台性的设计,Java的指令都是根据栈设计的。不用平台CPU架构不同,所以不能设计为基于寄存器的。有点是跨平台,指令集小,编译器容器实现,缺点是性能降低(比寄存器),实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpot VM的宿主机环境已经不局限于平台了),那么为什么不将架构更换为基于寄存器的架构呢?
Java虚拟机的启动时通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
有如下几种情况
世界上第一款商用Java虚拟机
现在Hotspot内置了此虚拟机
Exact Memory Management:准确式内存管理
HotSpot 占有绝对的市场地位,称霸武林
Sun/Oracle JDK和Open JDK 的默认虚拟机
名称中的HotSpot指的就是它的热点代码探测技术
通过计数器站到最具有编译价值代码,出发即时编译或栈上替换
通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取的平衡
专注于服务端应用
大量的行业基准测试显示,JRockit JVM是世界上最快的JVM
2008 年,BEA被Oracle收购了
Oracle表达了整合量大优秀虚拟机的工作,大致在JDK 8中完成。整合的方式是在Hotspot的基础上,移植JRockit的优秀特性
有影响力的三大商用虚拟机之一,另外两个(JRockit HotSpot)
微信公众号