1998年12月4日,JDK1.2发布,这是一个里程碑式的重要版本,工程代号为Playground(竞技场),这个版本代表性技术非常多,如EJB、JavaPlug-in、Swing、JavaIDL等,还有使用极为频繁的Collections体系工具类等,并且这个版本中Java虚拟机第一次内置了JIT(Just In Time)即时编译器,后续还发布了JDK1.2.1和JDK1.2.2两个小版本升级。在JDK1.2中曾经共存过ClassicVM、HotSpotVM、ExactVM三个虚拟机,其中HotSpot是作为附加程序提供。也是在这个版本中Sun开始拆分对应的Java产品线,Sun在这个版本中把Java技术体系拆分为三个方向:
2006年12月11日,JDK6发布,工程代号为Mustang(野马)。在这个版本中,Sun公司终结了从JDK 1.2开始已经有八年历史的J2EE、J2SE、J2ME的产品线命名方式,启用Java EE 6、Java SE 6、Java ME 6的新命名来代替。在JDK 6中提供了众多改进,如通过Mozilla JavaScript Rhino引擎提供初步动态语言支持,提供编译器注解处理器(Annotation Processor这也是Lombok的原理,通过注解生成模板代码)和微型HTTP服务器API,以及对虚拟机内部锁、同垃圾收集、类加载机制等方面进行了大量优化改动。在JDK 6发布以后由于代码的复杂化,Java开源、开发JavaFx、世界经济危机以及Oracle对Sun的收购提案等原因,Sun公司内忧外患自顾不暇,原本稳定的开发进度也受到了很大的影响,使得JDK 6的生命周期也持续了很久,一共发布了211个更新补丁,最终版本为Java SE 6 Update 211,于2018年10月18日发布。
2009年2月19日,工程代号为Dolphin(海豚)的JDK 7发布,这是其第一个里程碑版本,按照规划,共有十个里程碑版本发布,最后一个里程碑版本发布与2010年9月9日,由于各种原因JDK 7没有按照原计划完成。JDK 7开发阶段Sun公司在技术竞争和商业竞争中都深陷泥潭,已经无力推动开发进展,为了尽快完成JDK 7的发布,因此裁掉了大部分原定的功能,对于原定的Lambdax项目、Jigsaw项目、动态语言支持、Gabage-First垃圾收集器、Coin项目只匆匆交付了处于Experimental状态的G1垃圾收集器(直到2012年4月的Update 4中才开始正式商用),其余项目延期到JDK 8中。Oracle从JDK 7开始进行接手,迅速展现出了其极具商业化的处世风格,面对Java中使用最广泛的Java SE免费产品线,定义了一套新的商业版产品Java SE Support ,此外JDK 7计划维护到2022年,已经面向付费用户发布了211个补丁,最新版本为JDK 7 Update 211。
JEP 359: Records (Preview) 新增了java.lang.Record类,Record是一种轻量级的class,可以看做是数据结构体。Java作为面向对象的语言诞生以来,在大型项目中的优势就体现出来了,但是也有一点不好,过于繁琐,一个POJO JavaBean必须包含get、set等方法,Record主要就是解决这类问题的,类似于Lombok的功能。
JEP 365: ZGC on Windows
JEP 364: ZGC on macOS
JEP 345: NUMA-Aware Memory Allocation for G1 G1的NUMA感知内存分配。这样可以提高使用非均匀内存体系结构(NUMA)的大型计算机的性能。
JEP 349: JFR Event Streaming 通过启用工具以异步方式订阅Java Flight Recorder事件,这可以对JVM进行更实时的监视。
JEP 363: Remove the Concurrent Mark and Sweep (CMS) Garbage Collector,CMS作为一款主打老年代的并发垃圾收集器,虽然历任JDK中都没有被设置为默认的垃圾收集器,但是在解决STW问题时也是有着举足轻重的地位的,从JDK 7开始筹备到JDK 9作为默认的G1垃圾收集器,一度被认为CMS的升级版,在次CMS也开始走下历史舞台。
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination 随着每一代JDk中对垃圾收集器的升级以及新的垃圾收集器的引入,ParallelScavenge + SerialOld(Oracle指出很少有人使用)组合的GC也被弃用了,并在不久的将来被移除,完成了自己的历史使命。
JEP 356: Enhanced Pseudo-Random Number Generator 伪随机数增强器
JEP 391: macOS AArch64 Port 新平台的支持
JEP 410: Remove the Experimental AOT and JIT Compiler 移除了实验性质的AOT和JIT编译器
JEP 411: Deprecate the Security Manager for Removal 弃用安全管理器
JEP 406: Pattern Matching for switch (Preview) switch表达式,这可能是一个让switch翻身的功能。
JEP 412: Foreign Function and Memory API (Incubator) 外函数和内存相关的API,在JDK 14和JDK 15中引入的孵化API,使Java程序能够与Java运行时之外的代码和数据互操作,通过有效地调用外部函数(即,JVM之外的代码),并通过安全访问异物,这些API使Java程序能够调用本机库并进入本机数据而不提供Java本机接口(JNI)的脆性和复杂性。
JEP 414: Vector API (Second Incubator)允许表达在运行时可靠地编译的向量计算以支持的CPU架构上的优化矢量指令,从而实现优于等效标量计算的性能
IBM J9,内部名称曾定义为IT4J(IBM Technology for Java Virtual Machine),太长的名字,因此也看出名字的重要性,至今仍然活跃,与之对应的是可以更好的兼容在IBM的小型机运行平台,模块化也是其显著的优势和特点,因此可以按需启用,消耗较小的资源,提供更大的优势。
BEA LiquidVM/Azul VM 相比于大名鼎鼎的HotSpot、JRockit、J9等通用型的多平台兼容的JVM,还有一种与特定平台,硬件绑定的专有化虚拟机,BEA的Liquid VM不需要依托于其他操作系统,本身就已经系统化,直接运行在自家Hypervisor系统上。Azul VM是Azul Systems公司在HotSpot基础上进行大量改进,运行于自家专有硬件Vega上的虚拟机,可以管理大量的CPU和内存,使用的是有名的PGC和C4收集器。随着业务线的调整,2010年,Azul转型软件业务,把全部精力投入到Zing(以软件的方式达到接近Vega系统的虚拟机)的研发中,而HotSpot在JDK 11和JDK 12中的ZGC和Shenandoah也才达到同等目标,JVM的发展竞争也渐激烈。
Serial GC,这是最基础也是历史最悠久的收集器,在JDK 1.3.1之前,HotSpot中新生代唯一的收集器选择,在进行收集的时候会暂停所有工作线程直到收集结束,由于其单线程模式,也导致了STW时间过长,用户应用处于长时间假死状态,非常影响用户体验。但也是所有收集器中内存资源消耗最少的,在单核或者核心较小的服务器环境,也能体现出其特有的优势。在客户端模式下是一个不错的选择。
Serial Old GC,相对于Serial收集器,Serial Old专用于处理老年代GC,使用标记整理算法,主要也是在客户端模式下使用,如果在服务端模式下,在JDK 1.5之前与Parallel Scavenge配合使用,或者作为CMS失败后的预案,在Concurrent Mode Failure时使用。
基于JavaEE的框架由Sun公司发起的有EJB、JPA等,这些框架在设计初期,考虑到的规范众多,难于上手,因此没有很好的市场效应,EJB经历了1.0、2.0、3.0版本的大迭代,尤其是EJB3.0和之前的产品差异巨大,而JPA也被Hibernate一统持久化框架市场,做到了ORM领域的顶流产品。
Spring
Java诞生于1995年,赶上了互联网发展的浪潮,但Spring并不是伴随着Java产生的,因此在前近十年没有Spring的阶段,Java Web的开发也度过了一个黑暗漫长的阶段。Spring 由 Rod Johnson 创立,2004 年发布了 Spring 框架的第一版,其目的是用于简化企业级应用程序开发的难度和周期。
Spring使得Java开发变得更为简单,可以快速的构建出一个Java企业级应用,而且支撑对市面上大多数的Java框架的整合,正如其名,给Java程序员带来了春天,几乎人人都是Spring程序员。Spring特性可以概括为以下几点。
Spring Boot:即便SSM已经简化了在Struts2和Hibernate中复杂的配置关系,但是传统的Web项目依然存在大量的配置项,从web.xml到applicationContext.xml,再到SpringMVC等第三方xml,依然需要大量配置,仍有一定的学习成本,SpringBoot简化配置,根据常用的开发经验,简化maven依赖(即spring-boot-starter-和-spring-boot-starter),总结了一套体系化配置参数,约定大于配置(即application.properties和application.yml),并且内置Tomcat(SpringBoot2.x中已经切换到了undertow,拥有更高的并发处理能力)真正做到了一键启动。
Spring Cloud NetFlix:基于Spring Boot强大的配置能力,传统项目在处理一个业务复杂的系统时候,体量巨大,不便于需求迭代和业务开发,牵一发而动全身,部署应用时也需要更大的内存、CPU等资源消耗,因此可以对一个复杂的项目进行拆分,在业务场景上做到服务分治,在技术方案中利用Spring Boot快速构建,相得益彰,Spring Cloud诞生了。Spring Cloud并不特指某个具体的技术,而是一系列现有成熟技术的整合,官方的解释就是SpringBoot构建一切,Spring Cloud协调一切。Spring Cloud NetFlix是由NetFlix公司开源的一套微服务组件库,包含常见的微服务组件。
LNMP/WAMP LNMP一般指Linux、Nginx、MySQL、PHP,WAMP一般指Windows、Apache、MySQL、PHP,这种网站体系机构简单,单服务器可以部署所有资源(all in one),部署方便有很多现成的镜像包,一键启动建站的作用,区别的就是前者支持Linux环境,后者运行在Windows环境,Nginx和Apache都是静态服务器,处理一些简单嵌入式脚本语言,适用于业务简单、用户体量小的网站。
数据库层面的水平拆分,就是将一个数据表中的数据按照某种规则分化到不同的数据库中,也就是分库分表。应用层面的水平拆分,最经典的就是将整个应用分层。数据库访问层和业务逻辑层拆分、网关层和业务逻辑层拆分等等。
更为精细的可以参考AKF原则进行服务拆分,AKF 立方体也叫做scala cube,它在《The Art of Scalability》一书中被首次提出,旨在提供一个系统化的扩展思路,AKF 把系统扩展分为三个维度。