JVM第一篇 JVM与Java体系结构
JVM第一篇 JVM与Java体系结构
前言
世界上没有最好的语言,只有最适用于具体应用场景的编程语言
为什么要学习JVM
-
面试的需要
-
中高级程序员必备技能
- 项目管理、调优的需求
-
准备极客精神
- 如想了解垃圾回收算法、JIT、底层原理
1.Java及JVM简介
1.1Java生态圈
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 官方虚拟机手册
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java也早已不再是是一个门编程需要了,它更是一个平台、一种文化、一个社区
-
作为一个平台,Java虚拟机扮演者举足轻重的作用
- Groovy,Scala,JRuby,Kotlin等都是Java平台的一部分
-
作为一种文化,Java几乎成为可“开源”的代名词
- 第三方开源软件和框架 如Tomcat Spring全家桶 Mybatis等
- JDK和JVM本身也有不少开源的实现,如OpenJDK、Apache Harmony
-
作为社区,Java拥有世界最多的技术拥护者和开源社区的支持。从桌面应用软件、嵌入式开发到企业级应用、后台服务、中间件都可以看到Java的身影
1.2 Java:跨平台预言
1.3Java虚拟机
Java虚拟机是Java平台的基石。它是技术的组成部分,负责硬件和操作系统的独立性,编译代码的小巧大小以及保护用户免受恶意程序侵害的能力。
Java虚拟机是抽象的计算机。像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。使用虚拟机实现编程语言是相当普遍的。
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.2
1.4 JVM跨语言的平台
- 随着Java7的正式发布,Java虚拟机通过JSR-292规范实现在Java虚拟机平台运行非Java语言的编写程序
- Java虚拟机根本不关心运行在其内部的程序到底是使用何种语言编写的,它只关心“字节码文件”
Java不是最强大的语言,但是JVM是最强大的虚拟机。
1.5字节码
- java字节码,指的是java语言编译成的字节码,准确的说任何能在jvm平台上执行的字节码格式都是一样。统称为jvm字节码
- 不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行
- Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式-Class文件格式所关联,Class文件包含了Java虚拟机指令集(字节码)和符号表,还有一些辅助信息
1.6 多语言混合编程
-
Java平台上的多语言混合编程正成为,通过特定的语言决绝特定领域的问题是当前软件因公日趋复杂项目需求的一个方向。
-
各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样,因为它们最终都运行在一个虚拟机上面。
-
推动Java虚拟机从“Java语言的虚拟机”向“多语言虚拟机”的方向发展
2.Java发展的重大事件
2.1 Open JDK和Oracle JDK
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只包含最精简的JDK
OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
在JDK11之前,OracleJDK中还会存在一些OpenJDK中没有的、闭源的功能。但在JDK11中,可以认为OpenJDK和OracleJDK代码实质上已经完全一致。
3.虚拟机与JVM虚拟机
3.1虚拟机
-
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机
- 大名鼎鼎的visual box,VMWare就属于虚拟机,他们完全是第一是对物理计算机的方针,提供了一个可运行完整操作系统的软件平台
- 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令成为Java字节码指令
-
无论是系统虚拟机还是程序虚拟机,在上面运行写软件都被限制于虚拟机提供的资源中
3.2Java虚拟机
-
java虚拟机是一台执行java字节码的虚拟计算机,它拥有独立的运行几支笔,其运行的Java字节码也未必由java编译完成的
-
JVM平台的各种语言可以共享java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
-
java技术的可信就是Java虚拟机,因为所有的java程序都运行在java虚拟机内部。
-
作用
java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台的机器指令。每一条java指令,java虚拟机规范中都有详细的定义,如怎么去操作数,怎么处理操作数,处理结果放在那里
-
特点
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
3.3JVM的位置
JVM是运行在操作系统之上的,它与硬件没有直接交换
4.JVM的整体结构
- HotSpot VM 是目前市面上高性能虚拟机的代表
- 它采用解释器与即时编译器并存的架构
- 在今天,Java程序的运行性能早已脱胎换骨了,已经达到可以和C/C++程序一较高下的地步。
5.Java代码执行流程
6.JVM的架构模型
Java编译器输入的指令流基本是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
Hotspot VM 寄存器就是PC寄存器
总结
由于跨平台性的设计,Java的指令都是根据栈设计的。不用平台CPU架构不同,所以不能设计为基于寄存器的。有点是跨平台,指令集小,编译器容器实现,缺点是性能降低(比寄存器),实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpot VM的宿主机环境已经不局限于平台了),那么为什么不将架构更换为基于寄存器的架构呢?
7.JVM的生命周期
7.1虚拟机的启动
Java虚拟机的启动时通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
7.2虚拟机的执行
- 一个运行中的Java虚拟机有着一个清晰的的人:执行Java程序
- 程序开始执行时他才开始执行,程序结束时他就停止
- 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程
7.3虚拟机的退出
有如下几种情况
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
- 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
- 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况。
8.JVM的发展历程
- Sun Classic VM
世界上第一款商用Java虚拟机
现在Hotspot内置了此虚拟机
- Exact VM
Exact Memory Management:准确式内存管理
- HotSpot VM
HotSpot 占有绝对的市场地位,称霸武林
Sun/Oracle JDK和Open JDK 的默认虚拟机
名称中的HotSpot指的就是它的热点代码探测技术
通过计数器站到最具有编译价值代码,出发即时编译或栈上替换
通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取的平衡
- BEA JRockit
专注于服务端应用
大量的行业基准测试显示,JRockit JVM是世界上最快的JVM
2008 年,BEA被Oracle收购了
Oracle表达了整合量大优秀虚拟机的工作,大致在JDK 8中完成。整合的方式是在Hotspot的基础上,移植JRockit的优秀特性
- IBM J9
有影响力的三大商用虚拟机之一,另外两个(JRockit HotSpot)
微信公众号