作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
本篇博客即后续JVM相关笔记部分内容摘自周志明老师所写的<<深入理解Java虚拟机>> 一书,我可能会对书中部分提到的内容做一个扩容,方便我自己以后查看。
虽然该书讲述的是JDK1.7版本,我们生产环境已经过度到JDK1.8,截至2020年3月31日最新的JDK已经更新到Java SE 14,但不得不承认该书的确还有很多理论上的东西值得我们去学习和探索。
一.Java之父简介
如上图所示,詹姆斯·高斯林 (James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,一般公认他为"Java之父"。
博士论文的题目是:"The Algebraic Manipulation of Constraints"。毕业后到IBM工作,设计IBM第一代工作站NeWS系统,但不受重视。后来转至Sun公司。
1990年,与Patrick Naughton和Mike Sheridan等人合作"绿色计划",后来发展一套语言叫做"Oak",后改名为Java。
最早就是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。Java语言最早是在1991年开始设计的,期初叫Oak项目,它初衷是跑在不同机顶盒设备中的。
1993网景公司成立。Oak项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向WEB方向。并首先发布了可以让网页动起来的Applet技术(浏览器中嵌入运行Java字节码的技术)。
在1995年,一杯爪哇岛咖啡成就了Java这个名字。
1994年底,James Gosling在硅谷召开的"技术、教育和设计大会"上展示Java程式。
SUN公司(Standford University Network,斯坦福大学网络公司)第一个Java公开版本1.0发布于1996年。口号是"一次编写,到处运行(Write once,Run anywhere)",跨平台运行。
1999年,SUN公司发布了第二代Java平台(Java2)。
2000年,Java成为世界上最流行的电脑语言。
2009年4月20日,Sun被甲骨文公司并购,Oracle甲骨文公司宣布将以每股9.50美元,总计74亿美金收购SUN(计算机系统)公司。
2010年1月成功收购。Java商标从此正式归Oracle所有。
高斯林于2010年四月时宣布从甲骨文公司离职。
2011年3月29日,高斯林在个人博客上宣布将加入Google。
在2011年5月建立的Scala公司Typesafe Inc.高斯林被聘请为公司顾问。
2011年8月30日,仅仅加入Google数月之后的高斯林就在个人博客上宣布离开Google,加盟一家从事海洋机器人研究的创业公司Liquid Robotics,担任首席软件架构师。
八卦时刻:
高斯林一直对甲骨文(Oracle)公司报有不满.这位工程师在离开甲骨文(Oracle)公司时写到:"我所说的都关乎细节与诚实,但吐露真相指挥带来更多的坏处。"并称,"在Sun公司与甲骨文(Oracle)公司的并购会议上,导出都是Sun公司和谷歌专利的争吵。甲骨文问律师的眼睛闪闪发光。"
他表示,在收购Sun公司的阶段,甲骨文(Oracle)就表示出要同谷歌展开发法律交锋的意愿。他本人也称批判安卓市场的碎片化现象太过严重,足以影响软件开发者的工作。
二.Java发展史
1>.1991年
1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒,冰箱,收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身:Oak(橡树)。
Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。
2>.1995年
1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。
Java语言第一次提出了一次编写,到处运行("Write once,Run anywhere")的口号。
3>.1996年
1996年1月23日,JDK 1.0发布,Java语言有了第一个正式版本的运行环境。JDK 1.0提供了一个纯解释执行的Java虚拟机(Sun Classic VM)。JDK 1.0版本的代表技术包括:Java虚拟机,Applet,AWT等。
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术。同年9月,已有8.3万个网页应用了Java技术来制作。
在1996年5月底,Sun公司于美国旧金山举行了首届JavaOne大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。
4>.1997年
1997年2月19日,Sun公司发布了JDK 1.1, Java技术的一些最基础的支撑点(如JDBC等)都是在JDK1.1版本中发布的。
JDK 1.1版本的技术代表有:Jar文件格式,JDBC,JavaBeans,RMI。Java语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是这个时候出现的。
直到1999年4月8日,JDK 1.1一共发布了1.1一共发布了1.1.0~1.1.8九个版本,从1.1.4之后,每个JDK版本都有一个自己的名字(工程代号),分别为如下所示:
JDK 1.1.4-Sparkler(宝石)
JDK 1.1.5-Pumpkin(南瓜)
JDK 1.1.6-Abigail(阿比盖尔,女子名)
JDK 1.1.7-Brutus(布鲁图,古罗马政治家和将军)
JDK 1.1.8-Chelsea(切尔西,城市名)
5>.1998年
1998年12月4日,JDK迎来了一个里程碑式的版本JDK1.2,工程代号为Playground(竞技场),Sun公司在这个版本中把Java技术体系拆分成3个方向,分别是面向桌面应用开发的J2SE(Java 2 Platform,Standard Edition),面向企业级开发的J2EE(Java 2 Plaform,Enterprise Edition)和面向手机等移动端开发的J2ME(Java 2 Platform,Micro Edition)。
在这个版本中出现的代表性技术非常多,如EJB,Java Plug-in,Java IDL,Swing等,并且这个版本中的Java虚拟机第一次内置了JIT(Just In Time)编译器(JDK 1.2中曾并存过3个虚拟机,Classic VM,HotSpot VM和Exact VM,其中Exact VM只在Solaris平台出现过;后面两个虚拟机都是内置JIT编译器的,而之前版本所带的Class VM只能外挂的形式使用JIT编译器)。
在语言和API级别上,Java添加了strictfy关键字于现在Java编码之中几位常用的一系列Collections集合类。在1999年3月和7月,分别有JDK1.2.1和JDK1.2.2两个小版本发布。
6>.1999年
1999年4月27日,HotSpot虚拟机发布,HotSpot最初由一家名为"Longview Technologies"的小公司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。
HotSpot虚拟机发布时时作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机。
7>.2000年
2000年5月8日,工程代号为Kestrell(美洲红隼(sun,声调是三声,是美洲国家保护的一种鸟类))的JDK 1.3发布,JDK 1.3相对于JDK 1.2的改进主要表现在一些类库上(如数学运算和新的Timer API等),JNDI服务从JDK1 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展),使用CORBA IIOP来实现RMI的通信协议等等。
这个版本还对Java 2D做了很多改进,提供了大量新的Java 2D API,并且新添加了JavaSound类库。JDK 1.3有一个修正版本JDK 1.3.1,工程代号为Ladybird(瓢虫),于2001年5月17日发布。
自从JDK 1.3开始,Sun公司维护了一个习惯:大约每隔两年发布一个JDK的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程名称。
8>.2002年
2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一个版本,Compaq,Fujisu,SAS,Symbian,IBM等著名公司都参与甚至实现自己独立的JDK 1.4。
哪怕是十多年后的今天,仍然有许多主流应用(Spring,Hibernate,Struts等)能直接运行在JDK 1.4之上,或者继续发布能运行在JDK 1.4上的版本。
JDK 1.4同样发布了很多新的技术特性,如正则表达式,异常链,NIO,日志类,XML解析器和XSLI转换器等。
JDK 1.4有两个后续修正版:2002年9月16日发布的工程代号为Grasshopper(蚱蜢)的JDK 1.4.1与2003年6月26日发布的工程代号为Mantis(螳螂)的JDK 1.4.2。
2002年前后还发生了与Java没有直接关系,但事实上对Java的发展进程影响很大的时间,那就是微软公司的".NET Framework"发布了。这个无论是技术实现上还是目标用户上都与Java有很多相似之处的技术平台给Java带来了很多讨论,比较和竞争,".NET"平台和Java平台之间声势浩大的孰优孰劣的论战到目前都在继续。
9>.2004年
2004年9月30日,JDK1.5发布,工程代号Tiger(老虎)。从JDK 1.2以来,Java在语法层面上的变化一直很小,而JDK 1.5在Java语法易用性上做出了非常大的改进。
例如,自动装箱,泛型,动态注解,枚举,可变长参数,循环遍历(foreach循环)等语法特性都在JDK1.5中加入的。在虚拟机和API层面上,这个版本改进了Java的内存模型(Java Memory Model,JMM),提供了java.util.concurrent并发包等。
另外,JDK1.5是官方声明可以支持Windows 9x平台的最后以一个JDK版本。
10>.2006年
2006年12月11日,JDK 1.6发布,工程代号Mustang(野马)。在这个版本中,Sun终结了从JDK 1.2开始已经有8年历史的J2EE,J2SE,J2ME的命名方式,启用Java SE 6,Java EE 6,Java ME6的命名方式。
JDK 1.6的改进包括:提供动态语言支持(通过内置Mozilla JavaScript Rhino 引擎实现),提供编译API和微型HTTP服务器API等。同时,这个版本对Java虚拟机内部做了大量改进,包括所与同步,垃圾收集,类加载等方面的算法都有相当多的改动。
在2006年11月13日的JavaOne大会上,Sun公司宣布最终会将Java开源,并在一年多时间内,陆续将JDK的各部分在GPL v2(GNU General Public License V2)协议下公开源码,并建立OpenJDK组织对这些源码进行独立管理。
除了极少量的产权代码(Encumbered Code,这部分代码大多是Sun本身也无权限进行开源处理的)外,OpenJDK几乎包括了Sun JDK的全部代码,OpenJDK的质量主管曾经表示,在JDK1.7zhong ,Sun JDK和Open JDK除了代码文件头的版权注释之外,代码基本上完全一样,所以OpenJDK 7与Sun JDK1.7本质上就是同一套代码库开发的产品。
JDK 1.6发布以后,由于代码复杂性的增加,JDK开源,开发JavaFX,经济危机及收购方案等原因,Sun在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年发布一个主要版本的速度。JDK 1.6到目前为止一共发布了37个Updata版本,最新的版本为Java SE 6 updata 37,与2012年10月16日发布。
11>.2009年
2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本。
根据JDK 1.7版本的功能规划,一共设置了10个里程碑。最后一共里程碑版本原计划于2010年9月9日结束,但由于各种原因,JDK1.7最终无法按计划完成。
从JDK 1.7最开始的功能规划来看,它本应该是一个包含许多重要改进的JDK版本,其中的Lambda项目(Lambda表达式,函数式编程),Jigsaw项目(虚拟机模块化支持),动态语言支持,GarbageFirst收集器和Coin项目(语言细节进化)等子项目对于Java业界都会产生深远的影响。
在JDK 1.7开发期间,Sun公司由于相继在技术竞争和商业竞争中陷入了泥潭,公司的股票市值跌至仅有高峰期的3%,已无力推动JDK 1.7的研发工作按正常计划进行。
12>.2011年
为了尽快结束JDK 1.7长期"跳票"的问题,Oracle公司收购Sun公司后不久便宣布将实行"B计划",大幅裁剪了JDK 1.7预定目标,以便保证JDK 1.7的正式版能够于2011年7月28日准时发布。
"B计划"把不能按时完成的Lambda项目,Jigsaw项目和Coin项目的部分改进延迟到JDK 1.8之中。
最终,JDK 1.7的主要改进包括:提供新的G1收集器(G1在发布是依然处于Experimental状态,直至2012年4月的Updata4中才正式"转正"),加强对非Java语言的调用支持(JSR-292,这项特性到目前为止依然没有完全实现定型),升级类加载架构等。
到目前为止,JDK1.7已经发布了9个Updata版本,最新的Java SE 7 Upadata 9于2012年10月16日发布。从Java SE 7 Updata 4起,Oracle开始支持Mac OS X操作系统,并在Updata 6中达到完全支持的程度,同时,Updata 6中还对ARM指令集架构提供了支持。
至此,官方提供的JDK可以运行于Windows(不含Windows 9x),Linux,Solaris和Mac OS平台上,支持ARM,X86,X64和Sparc指令集架构类型。
2009年4月20日,Oracle公司宣布正式以74亿美元的架构收购Sun公司,Java商标从此正式归Oracle所有(Java语言本身并不属于哪个公司所有,它由JCP组织进行管理,尽管JCP主要由Sun公司或者Oracle公司所领导的)。由于此前Oracle分别从BEA和Sun中取得了目前三大商业虚拟机中的其中国两个:JRockit和HotSpot,Oracle公司宣布在未来1~2年内,将把这两个优秀的虚拟机互相取长补短,最终合二为一。可以预见在不久的将来,Java虚拟机技术上产生相当巨大的变化。
根据Oracle官方提供的信息,JDK 1.8的第一个正式版本将于2013年9月发布,JDK1.8将会提供在JDK 1.7中规划过,但最终未能在JDK 1.7中发布的特性,即Lambada表达式,Jigsaw(很不幸,随后Oracle公司又宣布Jigsaw在JDK 1.8中依然无法完成,需要延至JKD 1.9)和JDK 1.7中未实现的一部分Coin等。
在2011年的JavaOne大会上,Oracle公司还提到了JDK 1.9的长远规划,希望未来的Java虚拟机能够管理GB计的Java堆,能够更高效地于本地代码集成,并且另Java虚拟机运行时尽可能少人工干预,能够自行调节。
13>.2014年
2014年03年18日,Java SE 8.0 (1.8.0) Spider(蜘蛛)发布。
接口的默认方法和静态方法:
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。
默认方法使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的的方法,即不强制哪些实现了该接口的类也同时实现这个新加的方法。
Lambda表达式和函数式编程
下面有Lambda表示的案例代码。
Data API
注解(Annotation)
更好的类型推断:
Java 8编译器在类型推断方面有很大的提示,在很多场景下编译器可以推导出某个参数的数据类型,从而使得代码更为简洁。
Nashorn JavaScript引擎:
使用Metaspace(JEP 122)代替持久性(PermGen Space)。在JVM参数方面,使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyLambda extends JFrame {
private JButton jb;
public MyLambda(){
this.setBounds(300,300,600,300);
this.setTitle("Lambda测试");
jb = new JButton("Click");
//匿名内部类
// jb.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// System.out.println("点击成功...");
// }
// });
//使用Lambda表达式代替上述代码,可以很清楚的看出来谁的语法比较简洁
jb.addActionListener(event -> System.out.println("点击成功..."));
this.add(jb);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args){
new MyLambda();
}
}
MyLambda案例
14>.2017年
2017年09年21日,Java SE 9发布。
模块化系统 jShell命令 多版本兼容jar包、接口的私有方法、钻石操作符的使用升级语法改进:try语句、下划线使用限制、String存储结构变更、便利的集合特性:of()增强的Stream API、多分辨率图像 API、全新的HTTP客户端API、Deprecated的相关API智能Java编译工具、统一的JVM日志系统、javadoc的HTML 5支持、Javascript引擎升级:Nashornjava的动态编译器
15>.2018年
2018年03年14日,Java SE 10发布。
2018年9月25日,Oracle 官方宣布Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,非常值得大家的关注。
16>.2019年
2019年3月19日,Java 12 正式发布了。
2019年9月17日,Java SE 13正式发布。
17>.2020年
2020年3月17日,甲骨文正式发布Java 14(Oracle JDK 14)。秉承甲骨文对加速创新的一贯承诺,Java保持每六个月发布一次新版本,为企业和开发人员社区提供新的增强功能。新版Java开发工具包(JDK)提供了许多新特性,其中包括两个备受期待的新预览特性:instanceof模式匹配(JEP 305)和记录类(JEP 359),以及第二次作为预览特性的文本块(JEP 368)。
此外,最新版Java还增加了对switch表达式的Java语言支持,公开了用于持续监视DK Flight Recorder数据的全新API,将低延迟Z垃圾收集器的可用性扩展至macOS和Windows,并在孵化器模块中封装了独立Java应用和新的外部内存访问API,以此支持安全、高效地访问Java堆外部的内存。
关于最新的Java版本下载,可参考Oracle官方文档。
博主推荐阅读:
https://www.oracle.com/java/technologies/javase-downloads.html