# 第一章:走进 Java
# java 能够得到广泛认可的原因(优点)
① 摆脱硬件平台束缚,“一次编写,到处运行”;
② 提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题;
③ 实现了热点代码检测和运行时编译及优化,使得 java 应用能够随着时间增加而获得更高的性能;
④ 有一套完善的应用程序接口,还有无数商业机构和开源社区和第三方类库来帮助实现各种功能;
# java 技术体系包含以下几点
① java 程序设计语言(广义上讲,Clojure,JRuby,Groovy 等运行于 java 虚拟机上的语言及其相关的程序都属于 java 技术体系中的一员);
② 各种硬件平台上的 java 虚拟机;
③ Class 文件格式;
④ Java API 类库;
⑤ 来自商业机构和开源社区的第三方 java 类库;
# JDK 和 JRE
① 我们可以把 java 程序设计语言,java 虚拟机,java API 类库这三部分统称为 JDK,JDK 是用于支持 java 程序开发的最小环境;
② 可以把 java API 类库中的 java SE API 子集和 java 虚拟机这两部分统称为 JRE,JRE 是支持 java 程序运行的标准环境;
# 按照 java 技术关注的重点业务领域来划分,java 技术体系可以分为 4 个平台
① java Card:支持一些 java 小程序(Applets)运行在小内存设备(如智能卡)上的平台;
② java ME:适用移动终端平台,对 java API 有所精简,并加入针对移动终端的支持,以前叫 j2me;
③ java SE:支持桌面级应用的 java 平台,以前叫 j2se;
④ java EE:支持使用多层架构的企业应用(如 ERP,CRM 应用)的 java 平台,除了 java se api 外还有大量的扩充,以前叫 j2ee;
# java 发展历程
① 1995-5-23,Oak to Java;
② 1996-1-23,Java1.0;
③ 1997-2-18,Java1.1;
④ 1998-12-4,J2SE1.2,“playground”;
⑤ 2000-5-8,J2SE1.3,“Kestrel”;
⑥ 2002-2-13,J2SE1.4,“Merlin”;
⑦ 2004-9-29,JavaSE5,“tiger”;
⑧ 2006-12-11,JavaSE6,“Mustang”;
⑨ 2011-7-28,JavaSE7,“Dolphin”;
⑩ 2014-3-8,JavaSE8;
# JDK1.1 版本代表技术
① Jar 文件格式;
② JDBC;
③ Java Beans;
④ RMI(java 远程方法调用)
# JDK1.2 特点
① 技术体系拆分:J2SE,J2EE,J2ME;
② 新技术:EJB,Java Plug-in(插件),Java IDL(接口定义语言),Swing;
③ 虚拟机第一次内置 JIT 编译器(1.2 曾并存三个虚拟机,Classic VM(只能以外挂形式使用,不含 JIT),HotSpot VM - 这之后各个 java 版本使用的默认虚拟机,Exact VM(Solaris-UNIX 系统之一平台出现过));
④ API 级别:strictfp 关键字,Collections 集合类;
# JDK1.3 特点
① 类库:添加数学运算和新的 Timer API 类库;
② 平台级服务提供:JNDI(之前 JNDI 只是一个扩展);
③ RMI:使用 CORBA IIOP 实现;
④ Java 2D API;
⑤ Java Sound 类库;
# JDK1.4 特点(同年.net 发布)
① 正则表达式,异常链,NIO,日志类,XML 解析器,XSLT 转换器等
# JDK1.5 特点
① 自动装箱,泛型,动态注解,美剧,可变长参数,遍历循环(foreach 循环)等
② 改进内存模型(Java Memory Model,JMM);
③ 提供并发包,java.util.concurrent;
# JDK1.6 特点(同年决定将 java 开源,OpenJDK 出现,这之后便出现 Sun 收购案,08 经济危机等等)
① 命名方式:启用 Java SE 6,Java EE 6,Java Me 6(之前类似 J2SE);
② 提供动态语言支持(通过内置 Mozilla Javascript Rhino 引擎实现);
③ 提供编译 API 和微型 HTTP 服务器 API 等;
④ 对虚拟机内部改进:锁与同步,垃圾回收,类加载等方面算法;
# JDK1.7 特点(原计划)
① Lambda 项目(未实现,Lambda 表达式,函数式编程);
② Jigsaw 项目(未实现,Oracle 收购后准备在 1.8 版本实现,但后来又宣布无法完成,推迟到 1.9 版本实现);
③ 动态语言支持;
④ GarbageFirst 收集器;
⑤ Coin 项目(语言细节进化)
⑥ 提供新的 G1 收集器(12 年 update 4 中才转成正式),加强对 java 语言的调用支持(Jsr-292,至今没有完全实现定型),升级类加载架构等
# JDK1.8 特点
① 加入闭包(Lambda Expressions);
② Lambda 表达式,函数式编程;
③ 接口扩展;
# Sun Classic/Exact VM
① 世界第一款商用 Java 虚拟机,96 年 JDK1.0 版本使用,纯解释器方式来执行 java 代码,如使用 JIT 需要使用 sun 提供的外挂编译器,已被取代;1.3 版本备用,1.4 版本彻底退出历史舞台;
# Sun HotSpot VM
① 目前使用范围最广,收购的(收购公司 Longview);
② 一开始就是准确式 GC;
③ 热点探测,通过执行计数器找出最具有编译价值的代码,然后通知 jit 编译器一方法为单位进行编译,如果方法中有效循环次数很多,将会分别出发标准编译和 OSR(栈上替换)编译动作;
④ 08 年 oracle 收购 BEA 公司和 Sun 公司,这样同时拥有两款优秀的 java 虚拟机:JRockit 和 HotSpot,并宣布在不久的将来进行整合,整合方式大概是在 HotSpot 基础上,移植 JRockit 优秀的特性(如垃圾回收与 MissionControl 服务)
# Sun Mobile-Embedded VM/Meta-Circular VM
① KVM:android,ios 出现前手机平台使用;
② CDC/CLDC HotSpot Implementation:希望在手机,电子书,pda 等设备上建立统一的 Java 编程接口,但不乐观;
③ Squawk VM:运行于 Sun SPOT(一种手持的 wifi 设备),也曾运用于 java Card;
④ JavaInJava,实验性质的虚拟机;
⑤ Maxine VM:同 JavaInJava 性质;
# BEA JRockit
① 号称 “世界上速度最快的 java 虚拟机”,不太关注程序启动速度,因此不包含解析器实现,全部代码都靠编译器编译后执行;
② 垃圾收集器和 MissionControl 服务套件世界领先;
# IBM J9 VM
① 由 IBM Ottawa 实验室一个名为 SmallTalk 的虚拟机发展而来;
② 主要市场:和 IBM 产品(如 IBM WebSphere 等)搭配以及在 IBM AIX 和 z/OS 这些平台部署 java 应用;
# Azul VM 和 BEA Liquid VM
① 特定硬件平台的专有虚拟机;
② 前者运行于 Vega 系统,后者即现在的 JRockit VE,运行在自家 Hypervisor 系统上;
# Apache Harmony/Google Android Dalvik VM
① 只能称虚拟机,而不是 java 虚拟机
② Harmony 没有通过 TCK 认证(如果一个公司要宣布自己的运行平台 “兼容于 java 语言”,那就必须通过 TCK 兼容性测试,Apache 基金会曾一直要求 Sun 公司提供 TCK 的使用权限,但一直遭到拒绝,知道被 oracle 收购后,关系越来越僵,导致 Apache 愤然退出 JCP 组织,这是 java 社区最严重的一次 “分裂”,后来 OpenJdk 发布,其优势被削弱)
③ Dalvik 并不是一个 java 虚拟机,没有遵循 java 虚拟机规范,不能直接执行 java 的 class 文件,使用的是寄存器架构而不是 jvm 中常见的栈架构,但又与 java 有关系,他执行的 dex 文件是由 class 文件转化而来,使用 java 语法编写应用程序,可以使用大部分 java API;
# Microsoft JVM
① 微软为了在 IE3 支持 java Applets 应用而开发的 java 虚拟机,只有 windows 平台;
② Sun 控告微软侵权,赔偿 10 亿美金,然而当 windows xp sp3 中将 java 虚拟机抹去时,Sun 又希望微软不要这么做(很有讽刺性),这使得微软对 java 技术的热情消失,转为.net;
# java 模块化 - OSGI 技术
① java1.6,1.7 提出的模块化规范都没有通过,相对而言其主导权在 IBM 公司;
② 但其宣布将在 OpenJdk 中建立一个名为 Jigsaw(拼图)的子项目来推动这个规范在 java 平台转为具体的实现(好吧,这个不得不等到 java9,一直处于劣势地位);
# 混合语言
① 背景:java 平台上多语言混合编程正成为主流,每个层使用不同语言
② 朝多语言虚拟机转变
# 多核并行
① 1.5 的 concurrent 并发包是一个粗粒度的并发框架,而 1.7 的 java.util.concurrent.forkjoin 包则是一个重要扩充;
② Fork/Join 模式是处理并行编程的一个经典方法;
③ java8 中 Lambda 支持,添加函数式编程,函数式编程一个重要优点就是这样的程序天然地适合并行运行;
④ 目前显卡的算术运算能力,并行能力已经远远超过 CPU,在图形领域发掘显卡潜力是近些年计算机发展方向之一,如 C 语言的 CUDA,Java 则是 OpenJDK 中的子项目 Sumatra 项目(提供了使用 GPU 和 APU 运算能力的工具);
⑤ JDK 外围,如 Apache 的 Hadoop Map/Reduce 这些为了满足并行计算需求的并行框架,能狗运行在上千个商用服务器组成的大型集群上,并且能以一种可靠的容错方式并行处理 TB 级别的数据集;
⑥ 另外也出现了诸如 Scala,Clojure 及 Erlang 等天生就具备并行计算能力的语言;
# 进一步丰富语法
① java5:自动装箱,泛型,动态注解,枚举,可变长参数,遍历循环等语法
② java7 进一步扩充(有些推到 java8)
③ OpenJDK 中建立的 Coin 子项目:统一处理 java 语法的细节修改,如二进制原生支持,在 switch 语法中使用字符串,“<>” 操作符,异常处理的改进,简化变长参数方法的调用,面向资源的 try-catch-finally 语句等;
④ 除了 Coin 项目外,在 JSR-335 中定义的 Lambda 表达式也是;
# 64 位虚拟机
① java 运行于 64 位虚拟机需要额外代价:内存消耗过多(由于指针膨胀和各种数据类型对其补白的原因),通常比 32 位系统额外增加 10%-30% 内存消耗
② 运行速度几乎去那面落后于 32 位虚拟机,15% 左右性能差距;
③ java ee 方面企业经常需要超过 4G 的内存,对 64 位虚拟机需求迫切,但由于上述原因,很多都选择使用虚拟机集群等方式继续在 32 位虚拟机中进行部署;
③ JDK1.6 提供普通对象指针压缩功能(-XX:+UseCompressedOops),但是维持指针压缩会增加执行代码行数,很多方面都会受到影响;
# 自己编译 JDK
这个感觉比较复杂,要深入了解 JDK 源码,暂且略过吧