Java的前世今生
author:陈镇坤27
创建时间:2021年12月10日01:25:06
文章目录
————————————————————————————
写在前面
了解Java的发展历程,构建知识背景。
问:什么是JDK?
答:全称Java Development Kit(Java发展套具)。
狭义上主要指:Java程序设计语言、Java虚拟机实现和Java类库Api;
广义上指代Java技术体系。
根据JCP(Java Community Process(Java社区))规范定义,java技术体系主要包含:
1)Java程序设计语言;2)各种Java虚拟机实现,;3)Class文件格式;4)Java类库
问:Java有哪几支分支线?
答:
Java Card:支持小程序运行在小设备(例智能卡)上的平台
Java ME:Java Api精简版,支持Java运行在移动端,JDK6以前称为J2ME
Java SE:完整的Java Api,支持Java运行在桌面端,JDK6以前称为J2SE
Java EE:包含完整Java SE的扩展型Api,支持使用多层架构的企业应用,JDK6以前被称为J2EE,JDK10后被放弃,改名Jakarta EE,由Eclipse基金维护。
问:java的前身是什么语言?
答:(冷知识)Oak。1995年开始蜕变为Java。
问:Java发展时间线
答:
1995年,Oak改名Java,Java1.0问世——Write Onece,Run Any where
1996年,JDK1.0发布(Java虚拟机)
1997年,JDK1.1发布(JDBC、JavaBeans;内部类、反射)
——
JDK1.1.4之后,用工程代号命名迭代版本。
——
1998年,JDK1.2(Play ground)发布(Collections集合、内置JIT即时编译器)将技术拆分为3个方向。
此时同时存在三个虚拟机:Classic VM(默认)、HotSpot VM、Exact VM
1999年,HotSpot虚拟机诞生。
2000年,JDK1.3(Kestrel)发布(HotSpot VM(默认)、Java类库扩充)
——
此后每两年一个大版本。
——
2002年,JDK1.4(Merlin)发布(正则表达式、异常链、NIO、日志类、XML解析器)
同期,微软.NET发布
2004年,JDK5(Tiger)发布(自动装箱、泛型、动态注解、枚举、可变长参数、foreach循环)
此版本后,除了开发版仍然有标识1.x之外,正式名称为JDKx
2006年,JDK6(Mustang)发布(锁与同步、垃圾收集、类加载等的改动)
此版本后,结束了Java技术线的产品旧命名。
同年,在GPL v2协议下开源——OpenJDK
2009年,JDK7(Dolphin)发布(部分功能推后)(G1收集器(Experimental状态))
同年,Java被Oracle接手,并开始执行Java SE Support产品计划。
此后,Oracle获得世界三大商用虚拟机的两个——JRockit、HotSpot
2014年,JDK8发布(Lambda、新的时间日期api、移除HotSpot永久代)
此版本开始,启用JEP管理描述功能特性。
2017年,JDK9发布(Jigsaw(模块化规范))
为发布模块化规范,与JCP内部其他成员发生矛盾。
同时期公布,未来JDK每年3、9月发布大版本,每6个大版本(3年)一个lts版本(jdk8、11、14)(3年寿命),普通版寿命半年。
此后开发版本废弃1.x命名,改用版本号配合年月。
2018年3月,JDK10发布(Grall即时编译器、各种统一)
同期,Oracle状告谷歌
2018年9月,JDK11发布(ZGC垃圾收集器)
同期,将JDK11以前的所有商业特性开放给OpenJDK
发布新策略:一个遵循GPL v2协议的OpenJDK(最新版只有半年更新时间维护)
一个遵循OTN协议的OracleJDK(商用需付费,有3年更新时间维护)
2019年3月,JDK12发布(Shen-andoah垃圾收集器、Switch表达式)
该收集器由的RedHat领导开发,Oracle在OracleJDK中通过代码编译强行剔除。
问:什么是Java SE Support产品计划?
答:JDK7前80个版本更新免费,后面更新要么选择Java SE Support服务,要么升级JDK版本最新。
问:回顾Java虚拟机家族历史。
答:主要介绍Java SE上的虚拟机。
Sun Classic/Exact VM
Sun Classic VM在JDK1.0出现,1.2及之前都是默认虚拟机。1.2及之前执行java-version查看,可发现sunwjit提示,表示使用sun workshop jit外挂编译器,由于此时无法与解释器一起配合工作,编译器会重复对每一个代码进行编译,导致用户此后产生一种Java很慢的印象。
Exact VM在JDK1.2出现,内置即时JIT编译器,同时具备准确式内存管理能力——知道内存中某个位置的数据具体是什么类型,例如指向了12345内存地址是引用类型还是整数。
Classic VM的垃圾回收下,对象必须基于句柄(相当于变量/引用)以便查找。因为当时垃圾回收,对象位置可能发生移动,而在无法分辨内存中哪些对象是引用类型情况下,虚拟机不敢把所有内存中的对象的地址进行移动后位置值的更改,所以需要以句柄来记录对象的地址。(后面会讲述到一些细节)
Exact VM比较Classic VM,查找对象少了一层句柄查找的间接开销。
HotSpot VM
热点代码探测能力——通过程序计数器找出最具有编译价值的代码,然后通知即时编译器JIT以方法为单位进行编译。进一步地,可能会进行标准即时编译和栈上替换编译。
Oracle收购sun后,将BEA JRockit的许多优秀特性(Java Mission Control监控器)融入到了HotSpot,2014年,JDK8移除HotSpot VM的永久代。
BEA JRockit/IBM J9 VM
BEA JRockit,服务端应用,内部没有解释器实现,而是依赖即时编译器编译后执行,启动慢。版本停留在JDK6。
IBM J9 VM,原名IT4J,至今仍十分活跃,其职责分离与模块化较HopSpot优秀。
Apache Harmony VM
Apache Harmony,Apache开源项目,兼容JDK5、6,但没有通过TCK认证(被Sun公司阻挠拖延,后续导致Apache脱离JCP),后因OpenJDK而逐渐失去关注。
活跃,其职责分离与模块化较HopSpot优秀。
Apache Harmony VM
Apache Harmony,Apache开源项目,兼容JDK5、6,但没有通过TCK认证(被Sun公司阻挠拖延,后续导致Apache脱离JCP),后因OpenJDK而逐渐失去关注。