[toc]
Java 语言与 Java 生态圈
Oracle JDK 与 Open JDK 之间的关系
Oracle JDK
Java 最早是由 SUN 公司创造,Oracle JDK 之前叫 SUN JDK,不言而喻,这是在 2009 年 Oracle 收买 SUN 公司之前,收买之后被名为 Oracle JDK,实际上,Oracle JDK 是基于 OpenJDK 源代码构建的。
Open JDK
OpenJDK 是 Java SE 的开源实现,他由 SUN 和 Java 社区提供反对,2009 年 Oracle 收买了 Sun 公司,自此 Java 的保护方之一的 SUN 也变成了 Oracle。
大多数 JDK 都是在 OpenJDK 的根底上编写实现的,简直现有的所有 JDK 都派生自 OpenJDK,他们之间不同的是许可证。
两者区别
再粗犷些地说,OpenJDK 是开源的,Oracle JDK 是官网的
JDK 与 JRE 与 JVM
JDK
JDK 是 Java 开发工具包,是 Sun Microsystems 针对 Java 开发员的产品。
JDK 中蕴含 JRE,在 JDK 的装置目录下有一个名为 jre 的目录,外面有两个文件夹 bin 和 lib,在这里能够认为 bin 里的就是 jvm,lib 中则是 jvm 工作所须要的类库,而 jvm 和 lib 和起来就称为 jre。
JDK 是整个 JAVA 的外围,包含了 Java 运行环境 JRE(Java Runtime Envirnment)、一堆 Java 工具(javac/java/jdb 等)和 Java 根底的类库(即 Java API 包含 rt.jar)。
①SE(J2SE),standard edition,标准版,是咱们通常用的一个版本,从 JDK 5.0 开始,改名为 Java SE。
②EE(J2EE),enterprise edition,企业版,应用这种 JDK 开发 J2EE 应用程序,从 JDK 5.0 开始,改名为 Java EE。
③ME(J2ME),micro edition,次要用于挪动设施、嵌入式设施上的 java 应用程序,从 JDK 5.0 开始,改名为 Java ME。
JRE
是运行基于 Java 语言编写的程序所不可短少的运行环境。也是通过它,Java 的开发者才得以将本人开发的程序公布到用户手中,让用户应用。
JRE 中蕴含了 Java virtual machine(JVM),runtime class libraries 和 Java application launcher,这些是运行 Java 程序的必要组件。
与大家熟知的 JDK 不同,JRE 是 Java 运行环境,并不是一个开发环境,所以没有蕴含任何开发工具(如编译器和调试器),只是针对于应用 Java 程序的用户。
JVM
就是咱们常说的 java 虚拟机,它是整个 java 实现跨平台的最外围的局部,所有的 java 程序会首先被编译为.class 的类文件,这品种文件能够在虚拟机上执行。
也就是说 class 并不间接与机器的操作系统绝对应,而是通过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地零碎执行。
只有 JVM 还不能成 class 的执行,因为在解释 class 的时候 JVM 须要调用解释所须要的类库 lib,而 jre 蕴含 lib 类库。
JVM 屏蔽了与具体操作系统平台相干的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的指标代码(字节码),就能够在多种平台上不加批改地运行。
如何了解 Java 是跨平台的语言
“write once, run anywhere.” 一次写入,导出运行!
- 当 Java 源代码胜利编译成字节码后,如果想在不同的平台下面运行,则毋庸再次编译
- 这个劣势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp 等有弱小的解释器。跨平台仿佛曾经快成为一门语言必选的个性。
如何了解 JVM 是跨语言的平台
Java 虚拟机基本不关怀运行在其外部的程序到底是应用何种编程语言编写的,它只关怀“字节码”文件。
Java 不是最弱小的语言,然而 JVM 是最弱小的虚拟机。
Java 的倒退历程
- 2000 年,JDK 1.3 公布,Java HotSpot Virtual Machine 正式公布,成为 Java 的默认虚拟机。
- 2002 年,JDK 1.4 公布,古老的 Classic 虚拟机退出历史舞台。
- 2003 年年底,Java 平台的 Scala 正式公布,同年 Groovy 也退出了 Java 营垒。
- 2006 年,JDK 6 公布。同年,Java 开源并建设了 OpenJDK。牵强附会,Hotspot 虚拟机也成为了 OpenJDK 中的默认虚拟机。
- 2007 年,Java 平台迎来了新搭档 Clojure。
- 2008 年,Oracle 收买了 BEA, 失去了 JRockit 虚拟机。
- 2009 年,Twitter 发表把后盾大部分程序从 Ruby 迁徙到 Scala,这是 Java 平台的又一次大规模利用。
- 2010 年,Oracle 收买了 Sun,取得 Java 商标和最具价值的 HotSpot 虚拟机。此时,Oracle 领有市场占用率最高的两款虚拟机 HotSpot 和 JRockit,并打算在将来对它们进行整合:HotRockit. JCP 组织治理:Java 语言
- 2011 年,JDK7 公布。在 JDK 1.7u4 中,正式启用了新的垃圾回收器 G1。
- 2017 年,JDK9 公布。将 G1 设置为默认 GC,代替 CMS (被标记为 Deprecated)
- 同年,IBM 的 J9 开源,造成了当初的 Open J9 社区
- 2018 年,Android 的 Java 侵权案裁决,Google 抵偿 Oracle 计 88 亿美元
- 同年,JDK11 公布,LTS 版本的 JDK, 公布革命性的 ZGC, 调整 JDK 受权许可
- 2019 年,JDK12 公布,退出 RedHat 领导开发的 Shenandoah GC
常见的 JVM
- Sun Classic VM –> 解释型
- Exact VM –> Solaris
- *SUN 公司的 HotSpot VM*
- *BEA 的 JRockit –> 不蕴含解释器,服务器端,JMC*
- IBM 的 J9
- KVM 和 CDC/CLDC Hotspot
- Azul VM
- Liquid VM
- Apache Harmony
- Microsoft JVM
- TaobaoJVM
- Dalvik VM
- Graal VM –> 2018 年,“Run Programs Faster Anywhere”
-
其余 JVM:
Java Card VM、Squawk VM、JavaInJava、Maxine VM、Jikes RVM、IKVM.NET、Jam VM、Cacao VM、Sable VM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM
JVM 的生命周期?
虚拟机的启动
Java 虚拟机的启动是通过疏导类加载器 (bootstrap class loader) 创立一个初始类 (initial class) 来实现的,这个类是由虚拟机的具体实现指定的。
虚拟机的退出有如下的几种状况:
· 某线程调用 Runtime 类或 System 类的 exit 办法,或 Runtime 类的 halt 办法,并且 Java 平安管理器也容许这次 exit 或 halt 操作。
· 程序失常执行完结
· 程序在执行过程中遇到了异样或谬误而异样终止
· 因为操作系统呈现谬误而导致 Java 虚拟机过程终止
面试
对于 JVM 面试,面试官能够循序渐进从实践、实际各种角度深刻,也未必是要求面试者什么都懂。但如果你懂得原理,肯定会成为面试中的加分项。
说说 Java 虚拟机的生命周期(阿里)
重点说下 HotSpot?
· SUN 的 JDK 版本从 1.3.1 开始使用 HotSpot 虚拟机,2006 年底开源,次要应用 C ++ 实现,JNI 接口局部用 C 实现。
· HotSpot 是较新的 Java 虚拟机,应用 JIT(Just in Time)编译器,能够大大提高 Java 运行的性能。
· Java 原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而 HotSpot 将罕用的局部代码编译为本地 (原生,native) 代码,这样显着进步了性能。
· HotSpot JVM 参数能够分为规定参数 (standard options) 和非规定参数(non-standard options)。规定参数绝对稳固,在 JDK 将来的版本里不会有太大的改变。非规定参数则有因降级 JDK 而改变的可能。
跪求三连
码字不易,还请点个赞和珍藏~