JVM笔记-Java技术体系与JVM概述
1. 简述
Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系。
Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台",是因为每个平台上不同的虚拟机屏蔽了硬件的差异,而 Java 程序则是运行在虚拟机之上的。
本文简要介绍 Java 技术体系及 Java 虚拟机(Java Virtual Machine, JVM)的相关发展历程,后文再进一步分析 Java 虚拟机的详细内容。
PS: 本文及接下来的 JVM 笔记内容主要来自周志明《深入理解 Java 虚拟机(第3版)》。
2. Java技术体系
广义上讲,Kotlin、Groovy、JRuby 等运行于 Java 虚拟机上的编程语言及其相关程序都属于 Java 技术体系。
而从传统意义上来看,JCP 官方定义的 Java 技术体系主要包括:
- Java 程序设计语言
- 各种硬件平台上的 Java 虚拟机
- Class 文件格式
- Java 类库 API
- 商业机构和开源社区的第三方 Java 类库
其中 Java 程序设计语言、Java 虚拟机、Java 类库三部分统称为 JDK(Java Development Kit),JDK 是支持 Java 程序开发的最小环境。
Java 类库 API 中的 Java SE API 子集和 Java 虚拟机统称为 JRE(Java Runtime Environment),JRE 是支持 Java 程序运行的标准环境。
PS: JCP 全称 Java Community Process,即 Java 社区,由业界多家技术巨头组成的社区,用于定义和发展 Java 的技术规范。
Java 技术体系包含的内容如下:
3. JVM家族
"Java 虚拟机" 只是一个概念,它的实现产品众多,下面简要介绍其发展历程。
3.1 Sun Classic/Exact VM
Class VM (JDK 1.0)
世界上第一款商用 Java 虚拟机
- 纯解释器方式执行 Java 代码
- 对象查找基于句柄
Exact VM (JDK 1.2)
- 准确式内存管理:虚拟机可以知道内存中某个位置的数据具体类型
3.2 HotSpot VM
- Sun/OracleJDK 和 OpenJDK 中默认虚拟机
- 目前使用范围最广的 Java 虚拟机
由于 HotSpot 虚拟机是目前使用最广泛的,而且是目前 OracleJDK 和 OpenJDK 的默认虚拟机,后文的内容分析主要是针对该虚拟机。
终端执行 java -version 命令如下(不同机器会有所不同,此处仅供参考):
$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
这里的 HotSpot(TM) 64-Bit Server VM 指的就是 HotSpot 虚拟机。
3.3 Mobile/Embedded VM
- Java ME 虚拟机
3.4 BEA JRockit/IBM J9 VM
这两个虚拟机曾与 HotSpot 虚拟机并称"三大商业 Java 虚拟机"。
JRockit
- 专注于服务端应用
- 不含解释器,全部代码都由即时编译器编译后执行
J9 VM
- 职责分离与模块化优于 HotSpot VM
3.5 BEA Liquid VM/Azul VM
- 与特定硬件平台绑定、软硬件配合的专有虚拟机
3.6 Apache Harmony/Google Android Dalvik VM
这两者是 "虚拟机",而非 "Java 虚拟机"。
Harmony VM
- 未通过 TCK 认证
- 未大规模商用
Dalvik VM
- 未遵循《Java 虚拟机规范》
- 不能直接执行 Java 的 Class 文件
3.7 Microsoft JVM
- 曾经是 Windows 系统下性能最好的 Java 虚拟机
3.8 其他
- KVM:曾在手机平台上得到广泛应用
- Java Card VM
- ……
其他还有很多各种各样的虚拟机,不再一一列举。值得注意的是一个比较新的 Java 虚拟机:Graal VM。
3.9 Graal VM
2018 年 4 月,Oracle Labs 公开的黑科技:Graal VM。
Graal VM 被官方称为"Universal VM"和"Polyglot VM",它是在 HotSpot 虚拟机基础上增强而成的跨语言全栈虚拟机。可作为"任何语言"的运行平台,包括:
- Java、Scala、Groovy、Kotlin 等基于 Java 虚拟机之上的语言
- C、C++、Rust 等基于 LLVM 的语言,同时支持 JavaScript、Ruby、Python 等
如图所示:
而且自 JDK 10 起,HotSpot 中又加入了一个全新的即时编译器:Graal 编译器。
如若将来某一天 HotSpot 虚拟机真的被替换,Graal VM 很有可能"上位"。
4. 小结
本文主要介绍了 Java 技术体系和 Java 虚拟机的发展历程,该部分内容了解即可,后文再分析虚拟机的主要内容。
为便于回顾和总结,这里将上述内容整理成了思维导图:
PS: 本文首发于微信公众号【WriteOnRead】。
JVM笔记-Java技术体系与JVM概述的更多相关文章
- JVM学习之Java技术体系
目录 一.Java技术体系 1.Java体系构成 2.JDK.JRE.JVM之前的关系 JVM介绍 (1)JVM官方文档定义 (2)中文解释 JVM结构 Java代码执行流程 JVM架构模型 1.指令 ...
- JAVA技术体系发展路线
JAVA技术体系 1.1 Java程序员 ·高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 ·核心编程 IO.多线程.实体类.集合类.正则表达式.XM ...
- 简要概括java技术体系
以前一直在学java程序设计语言,学完了就以为自己已经把java学得差不多了,直到最近在看一本书<深入理解java虚拟机>,才发现自己以前学的只不过是冰山一角.相信很多小伙伴跟我一样,在没 ...
- 深入理解java虚拟机----java技术体系(一)
1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...
- Java 技术体系(JDK 与 JRE 的关系)、POJO 与 JavaBeans
Java 技术体系的分层结构(不同的颜色表示不同的层次),尤其注意 JDK 与 JRE 之间的包含关系: 图见 Java Platform Standard Edition 7 Documentati ...
- Java技术体系 JDK与JRE
从广义上讲,Clojure.JRuby.Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员.如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组 ...
- JVM笔记 -- Java跨平台和JVM跨语言
学习JVM的重要性 从上层应用程序到底层操作系统,到底有哪些东西? 平时开发的应用程序主要基于各种框架,譬如Spring,SpringMVC,Mybatis,而各种框架又是基于Java API来实现的 ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- Java技术体系图
Java程序员高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 ...
随机推荐
- java和javac命令
记录一下,今天无意中用到单独编译和执行某个java类,遇到各种Error: Could not find or load main class等问题,解决方案如下其中2和3选其一试试~ 1.javac ...
- Windows Server 2012 R2 强制卸载域控制器
本次实验要演示的是强制卸载域控制器并且在其他域控制器上删除不需要的服务器对象,这种情况在现实的生产使用环境中经常使用,每个企业每年都会有增减域控制器的时候,而且在减少了域控制器之后,原本的域还会继续使 ...
- 批量修改ACCESS表列名
问题来源:从ODBC导入数据到ACCESS 再从ACCESS导入到SQL数据库,ACCESS会多带个DBO. 所以需要批量修改ACCESS的表名. 首先需要引用ADOX引用方法:打开ACCESS的VB ...
- python 3新式类的多继承
因为我用的是python3,所以所用到的类都是新式类,这里我说的都是新式类,python2类的继承复杂一些,主要有新式类和老式类.python3类(新式类)的继承是是广度优先(BFS),实例如下: c ...
- 吴裕雄--天生自然python编程:turtle模块绘图(1)
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...
- <JZOJ4269>挑竹签
emm一开始将++cnt敲成cnt++ 就很委屈 一个拓扑排序而已 Description 挑竹签——小时候的游戏 夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签 ...
- 红灯区:DevOps 建设的思考和实践
点击关注"有赞coder" 获取更多技术干货哦- 作者:费解 团队:效能改进 背景 众所周知,在丰田精益生产中,核心观念包含对人的尊重.消除浪费.持续改善,只有这样,企业才能保持良 ...
- TCP并发、GIL全局锁、多线程讨论
TCP实现并发 #client客户端 import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while T ...
- SWUST OJ 东6宿舍灵异事件(0322)
东6宿舍灵异事件(0322) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31 Descriptio ...
- linux查看端口号占用命令-netstat
题记 经常会发现,很多时候我们在运行一些带有端口的程序时,程序经常会报端口被占用的问题,比如Tomcat 8080,端口起不来. 查看端口号 netstat 如果发现某个端口被占用后,可以用命令查看, ...