第1章 走近Java

1.1 概述

Java不可忽视优点:

  1. 它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想。
  2. 它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针的越界问题。
  3. 它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能。

1.2 Java技术体系

Java程序设计语言,Java虚拟机,Java API类库这三部分统称JDK(Java Development Kit)。JDK用于支持Java程序开发的最小环境。

Java API类库中的Java SE子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。

1.3 Java发展史

JDK1.0:提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM)。
JDK1.1:技术代表有:JAR文件格式,JDBC,JavaBeans,RMI;语法包括有:内部类(Inner Class)和反射(Reflection)。
JDK1.2:Java技术体系拆分为3个方向,分别为面向桌面应用开发的J2SE,面向企业级开发的J2EE,面向手机等移动终端开发的J2ME。技术代表有:EJB,Java Plug-in,Java IDL,Swing等。Java虚拟机第一次内置了JIT(Just In Time)编译器,JDK1.2中曾并存过3个虚拟机:Classic VM,HotSpot VM,Exact VM。默认虚拟机为HotSpot VM。
JDK1.3:一些类库上改进,如:数学运算和新的Timer API等,JNDI服务被作为一项平台级服务提供(以前JNDI仅仅是一项扩展)。
JDK1.4:新的技术特性,如:正则表达式,异常链,NIO,日志类,XML解析器和XSLT转换器等。
JDK1.5:在语法易用性上做出了很大改进,如:自动装箱,泛型,动态注解,枚举,可变长参数,foreach循环等。在虚拟机和API层面上,这个版本改进了Java的内存模型(JMM),提供了java.util.concurrent并发包等。
JDK1.6:提供动态语言支持,提供编译API和微型HTTP服务器API等。对虚拟机内部做了大量改进,包括锁与同步,垃圾收集,类加载等方面。
JDK1.7:提供新的G1收集器,加强对非Java语言的调用支持,升级类加载架构等。
JDK1.8:提供Lambda表达式,Jigsaw,JDK1.7中未实现的一部分Coin等。
JDK1.9:未来的Java虚拟机能够管理数以GB计的Java堆,能够更高效地与本地代码集成,并且令Java虚拟机运行时尽可能少人工干预,能够自动调节。

1.4 Java虚拟机发展史

1.4.1 Sun Classic / Exact VM

JDK1.0所带的虚拟机就是Classic VM:这款虚拟机只能使用纯解释器方式来执行Java代码。如果要使用JIT编译器,就必须进行外挂。但是假如外挂了JIT编译器,JIT编译器就完全接管了虚拟机的执行系统,解释器便不再工作了。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每一个方法,每一行代码都进行编译,而无论它们执行的频率是否具有编译价值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术。基于handler的对象查找方式,使用句柄来保持reference值的稳定。

JDK1.2所带的虚拟机就是Exact VM,Classic VM,HotSpot VM并存:Exact VM的执行系统已具备现代高性能虚拟机的雏形:如两级即时编译器,编译器与解释器混合工作模式等。因它使用准确式内存管理而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。由于使用了准确式内存管理,Exact VM可以摒弃以前Classic VM基于handler的对象查找方式(在没有明确信息表明内存中哪些数据是reference的前提下,虚拟机是不敢随意更改内存地址的,所以要使用句柄来保持reference值的稳定),这样每次定位对象都少了一次间接查找的开销,提升执行性能。默认使用的是Classic VM,可用java -hotspot参数切换至HotSpot VM。

1.4.2 Sun HotSpot VM

JDK1.3所带的虚拟机就是HotSpot VM:HotSpot指的就是它的热点代码探测技术。HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通过JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。通过编译器和解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。

1.5 展望Java技术的未来

1.5.1 模块化

模块化是解决应用系统与技术平台越来越复杂,越来越庞大问题的一个重要途径。Java模块化已经成为一项无法阻挡的变革潮流。

1.5.2 混合语言

Java平台上的多语言混合编程正成为主流,每种语言都可以针对自己擅长的方面更好地解决问题。试想一下,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层使用Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便。因为它们最终都运行在一个虚拟机之上。

通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。

1.5.3 多核并行

并行编程领域,早在JDK1.5就已经引入java.util.concurrent包实现了一个粗粒度的并发框架。而JDK1.7中加入的java.util.concurrent.forkjoin包则是对这个框架的一次重要扩充。Fork/Join模式是处理并行编程的一个经典方法,在此模式的使用范围之内,能够轻松地利用多个CPU核心提供的计算资源来协作完成一个复杂的计算任务。通过Fork/Join模式,我们能够顺畅地过渡到多核时代。

在Java 8中,将会提供Lambda支持,函数式编程的一个重要优点就是这样的程序天然地适合并行运行,这对Java语言在多核时代继续保持主流语言的地位很有帮助。

1.5.4 64位虚拟机

Java程序运行在64位虚拟机上需要付出比较大的额外代价:(1)首先是内存问题,由于指针膨胀和各种数据类型对齐补白的原因,运行于64位系统上的Java应用需要消耗更多的内存,通常要比32位系统额外增加10%~30%的内存消耗;(2)其次是性能问题,多个机构的测试结果显示,64位虚拟机的运行速度在各个测试项中几乎全面落后于32位虚拟机,两者大约有15%左右的性能差距。

面对以上问题,Sun给出的解决方案:在JDK 1.6 Update 14之后,提供了普通对象指针压缩功能(-XX:+UseCompressedOops,这个参数不建议显示设置,建议维持默认虚拟机的Ergonomics机制自动开启),在执行代码时,动态植入压缩指令以节省内存消耗,但是开启压缩指针会增加执行代码数量,因为所有的Java堆里的,指向Java堆内对象的指针都会被压缩,这些指针的访问就需要更多的代码才可以实现,而且并不只是读写字段才受影响,在实例方法调用,子类型检查等操作中也受影响,因为对象实例指向对象类型的引用也被压缩了。

1.6 实战:自己编译JDK

1.6.1 获取JDK源码

1.6.2 系统需求

1.6.3 构建编译环境

1.6.4 进行编译

1.6.5 在IDE工具中进行源码调试

你可能感兴趣的:(第1章 走近Java)