世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。
一、概述
Java目前广泛应用于嵌入式系统、移动终端、企业服务器和大型机
等各种场合。
Java目前具有600多万软件开发者,当然这是在几年前统计的,java能获得如此广泛的认可,除了因为他拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:
- 他摆脱了硬件平台的的束缚,实现了“
一次编写,到处运行
”的理想; - 它提供了一种相对
安全的内存管理和访问机制
,避免了绝大部分的内存泄漏和指针越界问题; - 他实现了热点代码检测和运行时编译及优化(
垃圾回收机制
),使得java应用能随着运行时间的增加而获得更高的性能; - 它有一套完善的
应用程序接口
,还有无数的开源社区的第三方类库来帮助实现各种各样的功能;
作为Java程序员,在编写程序除了尽情发挥Java各种优势外,还应该了解和思考一下Java技术体系中这些技术是如何实现的。认清这些技术运作本质
,是自己思考“程序这样写好不好”的基础和前提
。
二、Java技术体系
Sun官方所定义的Java技术体系包括了以下几个组成部分:
- Java程序设计语言
- 各种硬件平台上的Java虚拟机
- Class文件格式
- Java API类库
- 来自商业机构和开源社区的第三方Java类库
我们可以把Java程序设计语言、Java虚拟机、JavaAPI 类库
这三部分统称为JDK(Java Development Kit 中文名称:Java生长工具)。
Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE
(Java Runtime Environment 中文名称:Java运行环境)。
以上是根据各个组成部分的功能来进行划分,按照技术所服务的领域来划分可以分为四个平台,分别为:
- Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
- Java ME(Micro Edition):支持Java程序运行在移动终端上的平台,这个版本以前称为J2ME。
- Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前叫J2SE。
- Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,这个版本以前称为J2EE。
三、Java发展史
- 1991年4月,有James Gosling博士领导的绿色计划开始启动,
计划目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构
。这个计划的产品就是Java前身:Oak(橡树)。但是当时在市场上上并不成功,随着1995互联网兴起,Oak找到了适合自己发展的市场定位并蜕变称为了Java语言。 - 1995年5月,OAK改为了Java,Java1.0版本诞生。当时的口号就是“
Write Once,Run Anywhere
”的口号。 - 1996年1月,JDK1.0发布,JDK1.0版本的代表技术包括:
Java虚拟机、Applet和AWT
等。 - 1997年2月,JDK1.1发布,JDK1.1技术代表有:
JAR文件格式、JDBC、JavaBeans、RMI
。语法也有了一定的发展,如内部类、反射
。 - 1998年12月,JDK1.2发布,把Java技术体系拆分为了3个方向,分别是桌面应用开发J2SE、面向企业级开发J2ME、面向手机等移动端开发J2ME。
这也就是很多人好奇为什么老是听说什么J2EE,原因就是在这,他是在jdk1.2被正式提出来的。
技术代表有:EJB、Java Plug-in、Java IDL、Swing
等。语言上添加了Clollections集合类
。并且在这个版本Java虚拟机第一次内置了JIT(Just In Time)编译器。 - 2000年5月,JDK1.3发布,提供了
数学运算和新的Timer API
等。JNDI服务从JDK1.3开始作为一项平台服务提供(以前仅仅是一项扩展)。自JDK1.3开始,Sun维持了一个习惯:大约两年左右发布一个JDK主版本。 - 2002年2月,JDK1.4发布,很多著名公司参与甚至实现自己独立的JDK1.4。仍然有很多主流应用(Spring、Hibernate、Struts等)能直接在JDK1.4运行。技术特性:如
正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器
等。这一年微软的.NET Framework发布。 - 2004年9月,JDK1.5发布,语法上:
自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)
。在虚拟机和API层面上,这个版本引进了Java的内存模型(Java Memory Model,JMM)、提供了java.util.concurrent并发包
等。 - 2006年12月,JDK1.6发布,已提供动态语言支持(通过内置Mozilla JavaScript Rhimo引擎实现)。对Java虚拟机内部做了大量改进,包括
锁与同步、垃圾收集、类加载等方面算法都有相当多的改动
。 - 2009年2月,JDK1.7发布,改进包括:提供信的
G1收集器、升级类加载架构
,等等。2009年4月,Oracle以74亿美元
收购Sun公司。 - 2011年7月,甲骨文发布java7.0的正式版。
- 2014年3月,甲骨文(O)公司发布了Java8正式版,
对Lambda表达式的支持
,这让Java语言拥有了流畅的函数式表达能力,内置Nashorn JavaScript引擎
的支持,提供了新的时间、日期API
。彻底移除HotSpot的永久代
。 - 2017年9月,JDK1.9发布,Oracle随即宣布,以后 JDK将会在每年的
3月和9月各发布一个大版本
,JDK 9带着 Jigsaw最终发布了,除了Jigsaw外,JDK 9还增强了若干工具(JS Shell、JLink、JHSDB等),整顿了 HotSpot各个模块各自为战的日志系统,支持HTTP 2客户单API等91个JEP。 - 2018年3月,JDK10发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一 垃圾收集器接口等等。
- 2018年9月,JDK 11发布。
- 2019年2月,JDK 12发布。
jdk自出世以来,很多java公司全都停留在了1.8,尽管jdk现在可能都出了jdk18,这是为什么?
很多人都说,因为低版本的功能足够使用了;也有人说低版本的内容少、体积小,运行效率高。在我看来,最关键核心的因素是因为它免费!!!
那么有人要问啦,java本来不就是开源、免费的么?是的,它是免费的,但只是免费用于个人,用于研究、非生产环境。如果你把新版jdk用来放在生产环境,用于商业应用了,那么oracle随时可以向你收费。
所以,如果你的应用打算用于商业运营,请记住jdk最后一个商业免费版本:jdk-8u202
再者就是轻易升级原有项目的jdk版本会出现各种问题。某支付项目原来是jdk1.8,某天项目经理想尝试下升级到11,注意还仅仅是11,不是18,升级好以后,发现老代码报如下的最典型的Unsupported major.minor version 52.0错。不要小看jdk版本,版本之前其实差异是很大的。
四、混合语言
当单一的Java语言已经无法满足当前软件的复杂需求时,越来越多基于Java虚拟机的语言被应用到软件项目中。每种语言都可以针对自己擅长的方面更好地解决问题。接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难。因为他们最终都运行在一个虚拟机之上。
许多已经有很长历史的程序语言也出现了基于Java虚拟机实现的版本。
例如:jython是使用java实现的python,语法基本等同于python;
五、64位虚拟机
几年之前,主流的CPU就开始支持64位架构。Java虚拟机也在很早之前推出了支持64位系统的版本。但是发现了很多问题,首先是内存问题,由于指针膨胀和各种数据类型对齐补白的原因,运行于64位的Java应用相比32位,需要消耗更多的内存
。其次是运行速度,64位虚拟机的运行速度在各个测试项上和32位相差15%左右的性能差距
。
Sun注意到了这些问题,在JDK1.6之后,提供了普通对象指针压缩功能(-XX:+UseCompressedOops)。在解释器解释字节码时,植入压缩指令以节省内存消耗
。
文章来源于 深入理解Java虚拟机 一书当中。