文章目录

1.Java发展的重大事件

在上世纪90 年代初,sun 公司有一个叫做Green 的项目,目的是为家用消费电子产品开发一个分布式代码系统,这样就可以对家用电器进行控制,和它们进行信息交流。詹姆斯·高斯林(James Gosling)等人基于C++开发一种新的语言Oak(Java 的前身)。Oak是一种用于网络的精巧而安全的语言。Sun 公司曾依此投标一个交互式电视项目,但结果是被SGI打败,Sun 打算抛弃Oak。随着互联网的发展,Sun 看到了Oak 在计算机网络上的广阔应用前景,于是改造Oak,在1995 年5 月以“Java”的名称正式发布,从此Java走上繁荣之路。当然提到Java 历史,不得不提的一个故事就是Java 的命名。开始“Oak”的命名是以项目小组办公室外的树而得名,但是Oak 商标被其他公司注册了,必须另外取一个名字,传说有一天,几位Java 成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说就叫Java 怎样,得到了其他人的赞同,于是,Java这个名字就这样传开了。当然对于传说,了解一下就好了,不必过于认真。

  • 1990年,在Sun计算机公司中,由Patrick Naughton、MikeSheridan及James Gosling 领导的小组Green Team, 开发出的新的程序语言,命名为0ak,后期命名为Java.
  • 1995年,Sun正式发布Java和HotJava产品,Java 首次公开亮相。
  • 1996年1月23日Sun Microsystems发布了JDK 1.0。
  • 1998年,JDK 1.2版本发布。同时,Sun发布了JSP/Servlet、 EJB规范,以及将Java分成了J2EE、 J2SE和J2ME。这表明 了Java开始向 企业、桌面应用和移.动设备应用3大领域挺进。
  • 2000年,JDK 1.3发布,​​Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机​​。
  • 2002年,JDK 1.4发布,古老的Classic虛拟机退出历史舞台。
  • 2003年年底,Java平台的Scala正式发布,同年Groovy也加入了Java|阵营。
  • 2004年,JDK 1.5发布。同时JDK 1. 5改名为JavaSE 5.0。
  • 2006年,JDK 6发布。​​同年,Java开源并建立了OpenJDK。 顺理成章,Hotspot虚拟机也成为了OpenJDK中 的默认虛拟机。​
  • 2007年,Java平 台迎来了新伙伴Clqjure。
  • 2008年,​​Oracle收购了BEA, 得到了JRockit 虚拟机​​。
  • 2009年,Twitter宣布把后台大部分程序从Ruby迁移到scala,这是Java平台的又一次.大规模应用。
  • 2010年,​​Oracle收购了Sun,获得Java商标和最具价值的HotSpot虚拟机。此时,Oracle拥有市场占用率最高的两款虛拟机HotSpot和JRockit,并计划在未来对它们进行整合: HotRockit .​
  • 2011年,JDK7发布。​​在JDK 1. 7u4中,正式启用了新的垃圾回收器G1​​。
  • 2017年,JDK9发布。​​将G1设置为默认GC,替代CMS​​ 同年,IBM的J9开源,形成了现在的Open J9社区
  • 2018年,Android的Java侵权案判决,Google赔偿Oracle计88亿美元
    同年,Oracle宣告JavaEE成为历史名词,JDBC、JMS、Servlet赠 予Eclipse基金会
    同年,JDK11发布,LTs版本的JDK,发布革命性的ZGC,调整JDK授权许可
  • 2019年,JDK12发布,加入​​RedHat​​​领导开发的​​Shenandoah GC​​​JVM专题(一)-JVM与Java体系结构_java虚拟机

2.虚拟机与Java虚拟机

2.1.虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一 款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

大名鼎鼎的​​Visual Box​​​, ​​VMware​​就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。

程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虛拟机中执行的指令我们称为Java字节码指令。

无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

2.2.Java虚拟机

Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。

JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。

Java技术的核心就是Java虚拟机(JVM, ​​Java Virtual Machine​​),因为所有的Java程序都运行在Java虚拟机内部。

Java虛拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令, Java虛拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

特点

一次编译,到处运行
自动内存管理
自动垃圾回收功能

2.3.Jvm的位置

JVM专题(一)-JVM与Java体系结构_字节码_02

2.4.JVM、JRE、JDK

JVM、JRE、JDK 的关系如下图所示
JVM专题(一)-JVM与Java体系结构_java_03

3.学习 JVM 有什么用?

  • 面试必备
  • 中高级程序员必备
  • 想走的长远,就需要懂原理,比如:自动装箱、自动拆箱是怎么实现的,反射是怎么实现的,垃圾回收机制是怎么回事等待,JVM 是必须掌握的。

4.常见的JVM种类

4.1.HotSpot VM

HotSpot VM是绝对的主流。大家用它的时候很可能就没想过还有别的选择,或者是为了迁就依赖了Oracle/Sun JDK某些具体实现的烂代码而选择用HotSpot VM省点心。
Oracle / Sun JDK、OpenJDK的各种变种(例如IcedTea、Zulu),用的都是相同核心的HotSpot VM。当大家说起“Java性能如何如何”、“Java有多少种GC”、“JVM如何调优”云云,经常默认说的就是特指HotSpot VM。可见其“主流性”。

JDK8的HotSpot VM已经是以前的HotSpot VM与JRockit VM的合并版,也就是传说中的“HotRockit”,只是产品里名字还是叫HotSpot VM。

这个合并并不是要把JRockit的部分代码插进HotSpot里,而是把前者一些有价值的功能在后者里重新实现一遍。移除PermGen、Java Flight Recorder、jcmd等都属于合并项目的一部分不过要留意的是,这里的HotSpot VM特指“正常配置”版,而不包括“Zero / Shark”版。

Wikipedia那个页面上把后者称为“Zero Port”。用这个版本的人应该相当少,很多时候它的release版都build不成功

4.2.J9 VM

J9是IBM开发的一个高度模块化的JVM。在许多平台上,IBM J9 VM都只能跟IBM产品一起使用。这不是技术限制,而是许可证限制。例如说在Windows上IBM JDK不是免费公开的,而是要跟IBM其它产品一起捆绑发布的;使用IBM Rational、IBM WebSphere的话都有机会用到J9VM(也可以自己选择配置使用别的Java SE JVM)。

根据许可证,这种捆绑在产品里的J9 VM不应该用于运行别的Java程序…大家有没有自己“偷偷的”拿来跑别的程序IBM也没力气管(咳咳而在一些IBM的硬件平台上,很少客户是只买硬件不买配套软件的,IBM给一整套解决方案,里面可能就包括了IBM JDK。这样自然而然就用上了J9 VM。所以J9 VM得算在主流里,虽然很少是大家主动选择的首选。J9 VM的性能水平大致跟HotSpot VM是一个档次的。有时HotSpot快些,有时J9快些。不过J9 VM有一些HotSpot VM在JDK8还不支持的功能,最显著的一个就是J9支持AOT编译和更强大的class data sharing.

4.3.J9JRockit

JRockit以前Java SE的主流JVM中还有JRockit,跟HotSpot与J9一起并称三大主流JVM。
这三家的性能水平基本都在一个水平上,竞争很激烈。

自从Oracle把BEA和Sun都收购了之后,Java SE JVM只能二选一,JRockit就炮灰了。

JRockit最后发布的大版本是R28,只到JDK6;原本在开发中的R29及JDK7的对应功能都没来得及完成项目就被终止了。

我们主要学习的是 HotSpot 版本的虚拟机。

5.学习路线

JVM专题(一)-JVM与Java体系结构_java_04

  • ​ClassLoader​​:Java 代码编译成二进制后,会经过类加载器,这样才能加载到 JVM 中运行。
  • ​Method Area​​:类是放在方法区中。
  • ​Heap​​:类的实例对象。
  • 当类调用方法时,会用到​​JVM Stack​​​、​​PC Register​​​、​​本地方法栈​​。
  • 方法执行时的每行代码是有执行引擎中的解释器逐行执行,方法中的热点代码频繁调用的方法,由​​JIT 编译器​​​优化后执行,​​GC​​​ 会对堆中不用的对象进行回收。需要和操作系统打交道就需要使用到本地方法接口。
    JVM专题(一)-JVM与Java体系结构_java虚拟机_05

6.Java代码执行流程

JVM专题(一)-JVM与Java体系结构_字节码_06

  • Java编译器编译过程中,任何一个节点执行失败就会造成编译失败。
  • 虽然各个平台的Java虛拟机内部实现细节不尽相同,但是它们共同执行的字节码内容却是一样的。
  • JVM的主要任务就是负责将字节码装载到其内部,解释/编译为对应平台.上的机器指令(即:汇编语言)执行。
  • Java虚拟机使朋类加载器(Class Loader) 装载class文件。
  • 类加载完成之后,会进行字节码校验,字节码校验通过之后JVM解释器会把字— 节码翻译成机器码(即:汇编语言)交由操作系统执行。
  • 但不是所有代码都是解释执行的,JVM对此做了优化。比如,以Hotspot虚拟机来说,它本身提供了JIT (Just In Time)