走进Java
Java小白菜鸡想学深入理解Java虚拟机,做了一下笔记,水平有限,大牛切莫笑话
Java概述
Java
java不仅仅是一门语言,他还是一个由计算机软件和规范组成的技术体系。
Java的优点:
- Java拥有一门结构严谨,面向对象的编程语言
- 他拜托了硬件平台的束缚,实现了“ 一次编译,到处运行 ”的理想
- 提供了一种相对安全的内存管理和访问机制,避免了绝大多数内存泄漏和指针越界问题
- 它实现了热点代码检测和运行时编译及优化
- 拥有一套完善的应用程序接口
Java技术体系
广义上讲,Java技术体系,还包括Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序。但传统意义来说,JCP官方定义的下面几个部分:Java程序设计语言 、各种硬件平台上的Java虚拟机 、Class文件格式 、Java API类库 、来自商业机构和开源社区的第三方Java类库。
JDK是支持Java程序开发的最小环境,分为Java程序设计语言、Java虚拟机、Java API类库这三个部分
另外,JRE是支持Java 程序运行的标准环境,分为Java API类库中的Java SE API子集和Java虚拟机这两部分
按照技术关注的重点业务来讲,Java技术体系可分为四条产品线:Java Card、Java ME、 Java SE、Java EE。
Java发展史
1991年,高斯林博士开发出Java前身:Oak。
1995年5月23日,Oak改名为Java,并在SunWorld大会上发布了Java1.0,提出了“ Write Once,Run Anywhere ”的口号。
1996年1月23日,JDK1.0发布,包含技术Java虚拟机、Applet、AWT等。
1997年2月19日,Sun公司发布了JDK1.1,包含技术:JAR文件格式、JDBC、 JavaBeans、RMI,实现了内部类和反射。
1998年12月4日,JDK1.2发布,将java技术体系拆分成三个方向,J2SE、J2ME、J2EE。代表性技术为:EJB、Java Plug-in、Java IDL、Swing等,虚拟机内置了即时编译器JIT。
1999年4月27日,划时代的HotSpot发布。
2000年5月8日,JDK 1.3发布,之后稳定为每两年发布一个JDK主版本。
2002年2月13日,JDK 1.4发布,这是Java真正走向成熟的一个版本。
2004年9月30日,JDK 5发布,在易用性上有了很大改善,如:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性。在公开版本号上,由 “ JDK 1.x ”改名为“ JDK x ”。
2006年12月11日,JDK 6发布,将J2EE、J2SE、J2ME的命名凡是,改为 Java SE 6、Java EE 6、Java ME 6的命名方式。改进包括:提供动态语言支持、提供编译API和微型HTTP服务器API等。同时,这个版本对Java 虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。重要的是,Sun公司宣布将Java开源,并建立了OpenJDK组织对源码进行独立管理。
2009年4月20日,Oracle公司正式收购Sun公司,一代传奇从此成为历史。
2011年7月28日,JDK 7按照Oracle公司的计划如期发布。
2014年3月18日,JDK 8的第一个正式版本发布,支持lambda表达式,内置了Nashorn JavaScript引擎,加了新的时间、日期的API,彻底消移除了HotSpot的永久代。
2017年9月21日,JDK 9面世,Jigsaw模块化功能面世,除此之外,还加入了很多工具。JDK 9之后,Oracle每年3月和9月发布一个JDK的主版本。另外决定在每六个版本中划出一个LTS版,目前LTS版本有JDK 8和JDK 11。
2018年3月20日, JDK 10如期而至,主要研发目标是内部重构,如统一原仓库,统一垃圾收集器接口、统一即时编译器接口。另外,Oracle宣布Java EE正式成为历史,所有权赠给Eclipse基金会
2018年9月25日,JDK 11发布,这是一个LTS版本,包含17个JEP。
2019年2月,JDK 12发布前夕,RedHat从Oracle手中接过了OpenJDK 8和OpenJDK 11的管理权力和维护职责。
2019年3月20日,JDK12发布,包含了8个JEP。
Java虚拟机的历史
Sun Classic
Sun Classic虚拟机是世界上第一款商用虚拟机,他只能使用纯解释器的方式来执行Java代码,如果要是用即使编译器的话,就需要使用外挂。是JDK 1.1 和JDK 1.2默认的虚拟机。
Exact VM
精准式内存管理,他的编译执行系统已经具备了现代高性能虚拟机的雏形,如热点探测,两级即使编译器,编译器与解释器混合工作模式等,但还是英雄气短,商业应用上很短时间内就被外部引进的HotSpot VM所替代,
HotSpot VM
作者称他为武林盟主一点也不为过,他是目前适用范围最广的虚拟机,他继承了前两款商用虚拟机的优点,如热点代码探测能力。但这款虚拟机并非Sun公司开发的,Sun公司在1997年收购了Longview Technologies公司,从而获得了HotSpot虚拟机。
Mobile 和 Embedded VM
这两款虚拟机是面对移动和嵌入式市场的虚拟机产品。Oracle公司在Java ME上的虚拟机主要是CDC-HI和CLDC-HI两款虚拟机,前者面向高端设备,后者面向低端设备一点。
BEA JRockit 和 IBM J9 VM
这两款虚拟机与HotSpot合称为“ 三大商业Java虚拟机 ”。
JRockit后按城市世界还是那个速度最快的Java虚拟机,BEA将其发展为专门为服务器硬件和服务端应用场景高度优化的虚拟机。但是他不太关注程序启动速度,因此JRockit内部不包含解释器的实现,垃圾收集器和Java Mission Control故障处理套件等部分的实现。但BEA被Oracle收购后,就不再发展。
IBM J9不是IBM唯一虚拟机,但也是IBM的主力虚拟机,其市场定位与HotSpot相似,甚至在职责分离和模块化做的更胜一筹。至今也十分活跃。2016年起开源,将其捐献给了Eclipse基金会。
除此外,很多大公司也有自己的JDK和虚拟机,但除了从Sun或者Oracle公司买的版权或者是基于OpenJDK改进来的,并非自己开发。
BEA Liquid VM 和 Azul VM
这两种虚拟机是与特定的硬件平台绑定,软硬件配合工作的专有虚拟机,他们往往能够实现更高的执行性能,或者提供某些特殊的功能特性。
Liquid VM就是专门跑在BEA公司自己的Hypervisor系统上的JRockit虚拟机的虚拟化版本,这样的虚拟机可以直接跳过操作系统而直接控制硬件来发挥最大的性能。
Azul VM则是在HotSpot基础上大量改进的成果,其虚拟机有Vage、Zing、Zulu三条产品点,目前前者已被放弃。Zing跑在64位的X86Linux上,在低延迟、快速预热的场景中,相对于HotSpot有着有优势,而且方便了用户监控Java虚拟机的运行状态,这一切都是在用户无需了解垃圾收集等的底层调优前提下。
Apache Harmony 和 Google Android Dalvik VM
Apache Harmony是没有经过JCP授权的,虽然他没有大规模的商业运用过,但是他的许多代码被吸纳进IBM的JDK 7的实现以及Google Android SDK中,尤其是对Android 的发展起了很大的推动作用。
Dalvik VM是Android平台的核心组成部分之一,可以说他不是一个Java虚拟机,它没有遵循《Java虚拟机规范》,不能直接执行Java 的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。但是他和Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。
Microsoft JVM
Microsoft JVM是当时候Windows下最好用的JVM,但后来因为Sun公司的控告,停止了发展。
其他虚拟机
KVM(简单、轻量、高度可移植,但运行速度较慢)。
Java Card VM(应用于智能卡、SIM卡、银行信用卡等)。
Squawk VM(Sun公司开发,Java比重很高的嵌入式虚拟机实现,如类加载器、字节码验证器、垃圾收集器等都是用Java语言实现的)
JavaInJava(是Sun公司研发的实验室性质的虚拟机,他必须运行在另外一个宿主虚拟机上,内部没有即时编译器,代码只能用解释模式执行,执行速度较慢,但通过元循环证明只用一种语言可以自举,是具有它的研究价值的)。
Jikes RVM(他是IBM开发的专门用来研究java虚拟机实现技术的项目,也是一个元循环虚拟机)。
IKVM.NET(是基于微软.NET矿建实现的Java虚拟机)。
……
Java技术的未来
水平有限,这部分难免有亵渎袁术作者的部分,所以简短地记一下
Java面临的危机和挑战前所未有的艰巨,属于java的未来也从未如此充满想象与可能没事继续前进、再攀高峰,还是由盛转衰、锋芒挫缩,我们拭目以待。
无语言倾向
Java现在仍是世界第一编程语言,他拥有庞德的用户群和极其成熟的软件生态,朝夕之间难以撼动。但Graal VM 黑科技的公开,是的各种语言可以支持大部分语言来混合使用,
新一代即时编译器
HotSpot虚拟机中有两个即时编译器:C1和C2二者配合执行。Greel编译器在开发效率和拓展性上要优于C2编译器,但尚且年幼,还需要经过更多的实践验证。
向Native迈进
Java在短时间或者小型化应用上,天生带有一定劣势。Java启动时间长,需要预热才能达到最高性能等特点有悖于微服务架构场景。不过,Java推出了跨进程的、可以面向用户程序的类型信息共享、无操作的来及收集器、等改善措施。一个更彻底的解决方案就是逐步开始对提前编译提供技术支持。但提前编译也有缺点,违背了Java“ 一次编写,到处运行 ”的承诺、也显著降低了Java链接过程的动态性等等。而Substrate VM的出现,终于满足了人们对于java提前编译的全部期待,有了及小型的运行时环境,包括独立的异常处理、同步调度、线程管理、内存管理、和JNI访问等组件。它还包含了一个本地镜像的构造器,可以直接从目标程序开始运行,无需重复Java虚拟机的初始化,这样做可以显著降低内存占用及启动时间。
灵活的胖子
HotSpot开发团队在持续地重构HotSpot框架,让他具有模块化的能力和足够的开放性。在JDK 1.4之前,就曾开放过Java虚拟机信息监控接口和调试接口,供运维和性能监控、IDE等外部工具的使用。到JDK 5时有了层次更高的Java虚拟机工具接口,JDK 6时JVMTI就整合替代了JVMPI和JVMDI的作用。JDK 9时,HotSpot虚拟机开放了Java语言级别的编译器接口,使得在Java虚拟机外部增加、替换即时编译器成为可能。JDK 10时,HotSpot重构了Java虚拟机的垃圾收集接口,同意了其内部各款垃圾收集器的公共行为。有了这个接口,才可能存在之后的CMS收集器退役。
语言语法持续增强
Java社区有创建了另外一个新的语言特性改进项目Amber,JDK10到JDK13里面提供的新语法都是基本来自于这个项目。除语法糖外,还有语言的功能也在持续改进中。随着Java语言每年更新两次的节奏,新版本的Java中会出现越来越多的优秀特性。
编译自己的JDK
之前熟悉Linux的时候编译过,文档之后发布
之前的文档链接
(不需要积分的,免费下载,唯一要求:不要笑话我菜,嘿嘿)