本书第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据的JDK 1.7对全书内容进行了的升级和补充;增加了大量处理各种常见JVM问题的技巧和实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。
全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了而深入的分析,深刻揭示了JVM的工作原理。及时部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
本书第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据的JDK 1.7对全书内容进行了的升级和补充;增加了大量处理各种常见JVM问题的技巧和实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。
前言
及时部分走近Java
第1章走近Java
1.1概述
1.2Java技术体系
1.3Java发展史
1.4Java虚拟机发展史
1.4.1Sun Classic Exact VM
1.4.2Sun HotSpot VM
1.4.3Sun Mobile-Embedded VM Meta-Circular VM
1.4.4BEA JRockit IBM J9 VM
1.4.5Azul VM BEA Liquid VM
1.4.6Apache Harmony Google Android Dalvik VM
1.4.7Microsoft JVM及其他
1.5展望Java技术的未来
1.5.1模块化
1.5.2混合语言
1.5.3多核并行
1.5.4进一步丰富语法
1.5.564位虚拟机
1.6实战:自己编译JDK
1.6.1获取JDK源码
1.6.2系统需求
1.6.3构建编译环境
1.6.4进行编译
1.6.5在IDE工具中进行源码调试
1.7本章小结
第二部分自动内存管理机制
第2章Java内存区域与内存溢出异常
2.1概述
2.2运行时数据区域
2.2.1程序计数器
2.2.2Java虚拟机栈
2.2.3本地方法栈
2.2.4Java堆
2.2.5方法区
2.2.6运行时常量池
2.2.7直接内存
2.3HotSpot虚拟机对象探秘
2.3.1对象的创建
2.3.2对象的内存布局
2.3.3对象的访问定位
2.4实战:OutOfMemoryError异常
2.4.1Java堆溢出
2.4.2虚拟机栈和本地方法栈溢出
2.4.3方法区和运行时常量池溢出
2.4.4本机直接内存溢出
2.5本章小结
第3章垃圾收集器与内存分配策略
3.1概述
3.2对象已死吗
3.2.1引用计数算法
3.2.2可达性分析算法
3.2.3再谈引用
3.2.4生存还是死亡
3.2.5回收方法区
3.3垃圾收集算法
3.3.1标记-清除算法
3.3.2复制算法
3.3.3标记-整理算法
3.3.4分代收集算法
3.4HotSpot的算法实现
3.4.1枚举根节点
3.4.2安全点
3.4.3安全区域
3.5垃圾收集器
3.5.1Serial收集器
3.5.2ParNew收集器
3.5.3Parallel Scavenge收集器
3.5.4Serial Old收集器
3.5.5Parallel Old收集器
3.5.6CMS收集器
3.5.7G1收集器
3.5.8理解GC日志
3.5.9垃圾收集器参数总结
3.6内存分配与回收策略
3.6.1对象优先在Eden分配
3.6.2大对象直接进入老年代
3.6.3长期存活的对象将进入老年代
3.6.4动态对象年龄判定
3.6.5空间分配担保
3.7本章小结
第4章虚拟机性能监控与故障处理工具
4.1概述
4.2JDK的命令行工具
4.2.1jps:虚拟机进程状况工具
4.2.2jstat:虚拟机统计信息监视工具
4.2.3jinfo:Java配置信息工具
4.2.4jmap:Java内存映像工具
4.2.5jhat:虚拟机堆转储快照分析工具
4.2.6jstack:Java堆栈跟踪工具
4.2.7HSDIS:JIT生成代码反汇编
4.3JDK的可视化工具
4.3.1JConsole:Java监视与管理控制台
4.3.2VisualVM:多合一故障处理工具
4.4本章小结
第5章调优案例分析与实战
5.1概述
5.2案例分析
5.2.1高性能硬件上的程序部署策略
5.2.2集群间同步导致的内存溢出
5.2.3堆外内存导致的溢出错误
5.2.4外部命令导致系统缓慢
5.2.5服务器JVM进程崩溃
5.2.6不恰当数据结构导致内存占用过大
5.2.7由Windows虚拟内存导致的长时间停顿
5.3实战:Eclipse运行速度调优
5.3.1调优前的程序运行状态
5.3.2升级JDK 1.6的性能变化及兼容问题
5.3.3编译时间和类加载时间的优化
5.3.4调整内存设置控制垃圾收集频率
5.3.5选择收集器降低延迟
5.4本章小结
第三部分虚拟机执行子系统
第6章类文件结构
6.1概述
6.2无关性的基石
6.3Class类文件的结构
6.3.1魔数与Class文件的版本
6.3.2常量池
6.3.3访问标志
6.3.4类索引、父类索引与接口索引集合
6.3.5字段表集合
6.3.6方法表集合
6.3.7属性表集合
6.4字节码指令简介
6.4.1字节码与数据类型
6.4.2加载和存储指令
6.4.3运算指令
6.4.4类型转换指令
6.4.5对象创建与访问指令
6.4.6操作数栈管理指令
6.4.7控制转移指令
6.4.8方法调用和返回指令
6.4.9异常处理指令
6.4.10同步指令
6.5公有设计和私有实现
6.6Class文件结构的发展
6.7本章小结
第7章虚拟机类加载机制
7.1概述
7.2类加载的时机
7.3类加载的过程
7.3.1加载
7.3.2验证
7.3.3准备
7.3.4解析
7.3.5初始化
7.4类加载器
7.4.1类与类加载器
7.4.2双亲委派模型
7.4.3破坏双亲委派模型
7.5本章小结
第8章虚拟机字节码执行引擎
8.1概述
8.2运行时栈帧结构
8.2.1局部变量表
8.2.2操作数栈
8.2.3动态连接
8.2.4方法返回地址
8.2.5附加信息
8.3方法调用
8.3.1解析
8.3.2分派
8.3.3动态类型语言支持
8.4基于栈的字节码解释执行引擎
8.4.1解释执行
8.4.2基于栈的指令集与基于寄存器的指令集
8.4.3基于栈的解释器执行过程
8.5本章小结
第9章类加载及执行子系统的案例与实战
9.1概述
9.2案例分析
9.2.1Tomcat:正统的类加载器架构
9.2.2OSGi:灵活的类加载器架构
9.2.3字节码生成技术与动态的实现
9.2.4Retrotranslator:跨越JDK版本
9.3实战:自己动手实现远程执行功能
9.3.1目标
9.3.2思路
9.3.3实现
9.3.4验证
9.4本章小结
第四部分程序编译与代码优化
第10章早期(编译期)优化
10.1概述
10.2Javac编译器
10.2.1Javac的源码与调试
10.2.2解析与填充符号表
10.2.3注解处理器
10.2.4语义分析与字节码生成
10.3Java语法糖的味道
10.3.1泛型与类型擦除
10.3.2自动装箱、拆箱与遍历循环
10.3.3条件编译
10.4实战:插入式注解处理器
10.4.1实战目标
10.4.2代码实现
10.4.3运行与测试
10.4.4其他应用案例
10.5本章小结
第11章晚期(运行期)优化
11.1概述
11.2HotSpot虚拟机内的即时编译器
11.2.1解释器与编译器
11.2.2编译对象与触发条件
11.2.3编译过程
11.2.4查看及分析即时编译结果
11.3编译优化技术
11.3.1优化技术概览
11.3.2公共子表达式消除
11.3.3数组边界检查消除
11.3.4方法内联
11.3.5逃逸分析
11.4Java与CC++的编译器对比
11.5本章小结
第五部分高效并发
第12章Java内存模型与线程
12.1概述
12.2硬件的效率与一致性
12.3Java内存模型
12.3.1主内存与工作内存
12.3.2内存间交互操作
12.3.3对于volatile型变量的特殊规则
12.3.4对于long和double型变量的特殊规则
12.3.5原子性、可见性与有序性
12.3.6先行发生原则
12.4Java与线程
12.4.1线程的实现
12.4.2Java线程调度
12.4.3状态转换
12.5本章小结
第13章线程安全与锁优化
13.1概述
13.2线程安全
13.2.1Java语言中的线程安全
13.2.2线程安全的实现方法
13.3锁优化
13.3.1自旋锁与自适应自旋
13.3.2锁消除
13.3.3锁粗化
13.3.4轻量级锁
13.3.5偏向锁
13.4本章小结
附录
附录A编译Windows版的OpenJDK
附录B虚拟机字节码指令表
附录CHotSpot虚拟机主要参数表
附录D对象查询语言(OQL)简介
附录EJDK历史版本轨迹
及时部分
走近Java
第1章走近Java
第1章走近Java
世界上并没有的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求的过程。
1.1概述
Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,如图1-1所示。时至今日,Java技术体系已经吸引了900多万软件开发者,这是全球较大的软件开发团队。使用Java的设备多达几十亿台,其中包括11亿多台个人计算机、30亿部移动电话及其他手持设备、数量众多的智能卡,以及大量机顶盒、导航系统和其他设备。
Java能获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了"一次编写,到处运行"的理想;它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能;它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助它实现各种各样的功能……Java所带来的这些好处使程序的开发效率得到了很大的提升。作为一名Java程序员,在编写程序时除了尽情发挥Java的各种优势外,还应该去了解和思考一下Java技术体系中这些技术特性是如何实现的。认识这些技术运作的本质,是自己思考"程序这样写好不好"的基础和前提。当我们在使用一种技术时,如果不再依赖书本和他人就能得到这些问题的答案,那才算上升到了"不惑"的境界。
本书将与读者一起分析Java技术中最重要的那些特性的实现原理。在本章中,我们将重点介绍Java技术体系内容以及Java的历史、现在和未来的发展趋势。
1.2Java技术体系
从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员。如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:
?Java程序设计语言
?各种硬件平台上的Java虚拟机
?Class文件格式
?Java API类库
?来自商业机构和开源社区的第三方Java类库
我们可以把Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境,在后面的内容中,为了讲解方便,有一些地方会以JDK来代替整个Java技术体系。另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。图1-2展示了Java技术体系所包含的内容,以及JDK和JRE所涵盖的范围。
以上是根据各个组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java技术体系可以分为4个平台,分别为:
?Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
?Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
?Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
?Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为J2EE。
1.3Java发展史
从及时个Java版本诞生到现在已经有18年的时间了。沧海桑田一瞬间,转眼18年过去了,在图1-3所展示的时间线中,我们看到JDK已经发展到了1.7版。在这18年里还诞生了无数和Java相关的产品、技术和标准。现在让我们走入时间隧道,从孕育Java语言的时代开始,再来回顾一下Java的发展轨迹和历史变迁。
1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身:Oak(橡树)。Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。
1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式Java 1.0版本。Java语言及时次提出了"Write Once,Run Anywhere"的口号。
1996年1月23日,JDK 1.0,Java语言有了及时个正式版本的运行环境。JDK 1.0提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM)。JDK 1.0版本的代表技术包括:Java虚拟机、Applet、AWT等。
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术。同年9月,已有大约8.3万个网页应用了Java技术来制作。在1996年5月底,Sun公司于美国旧金山举行了首届JavaOne大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。
1997年2月19日,Sun公司了JDK 1.1,Java技术的一些最基础的支撑点(如JDBC等)都是在JDK 1.1版本中的,JDK 1.1版的技术代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。
直到1999年4月8日,JDK 1.1一共了1.1.0~1.1.8九个版本。从1.1.4之后,每个JDK版本都有一个自己的名字(工程代号),分别为:JDK 1.1.4 - Sparkler(宝石)、JDK 1.1.5 - Pumpkin(南瓜)、JDK 1.1.6 - Abigail(阿比盖尔,女子名)、JDK 1.1.7 - Brutus(布鲁图,古罗马政治家和将军)和JDK 1.1.8 Chelsea(切尔西,城市名)。
1998年12月4日,JDK迎来了一个里程碑式的版本JDK 1.2,工程代号为Playground(竞技场),Sun在这个版本中把Java技术体系拆分为3个方向,分别是面向桌面应用开发的J2SE(Java 2 Platform, Standard Edition)、面向企业级开发的J2EE(Java 2 Platform, Enterprise Edition)和面向手机等移动终端开发的J2ME(Java 2 Platform, Micro Edition)。在这个版本中出现的代表性技术非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且这个版本中Java虚拟机及时次内置了JIT(Just In Time)编译器(JDK 1.2中曾并存过3个虚拟机,Classic VM、HotSpot VM和Exact VM,其中Exact VM只在Solaris平台出现过;后面两个虚拟机都是内置JIT编译器的,而之前版本所带的Classic VM只能以外挂的形式使用JIT编译器)。在语言和API级别上,Java添加了strictfp关键字与现在Java编码之中极为常用的一系列Collections集合类。在1999年3月和7月,分别有JDK 1.2.1和JDK 1.2.2两个小版本。
1999年4月27日,HotSpot虚拟机,HotSpot最初由一家名为"Longview Technologies"的小公司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。HotSpot虚拟机时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机。
2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3,JDK 1.3相对于JDK 1.2的改进主要表现在一些类库上(如数学运算和新的Timer API等),JNDI服务从JDK 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展),使用CORBA IIOP来实现RMI的通信协议,等等。这个版本还对Java 2D做了很多改进,提供了大量新的Java 2D API,并且新添加了JavaSound类库。JDK 1.3有1个修正版本JDK 1.3.1,工程代号为Ladybird(瓢虫),于2001年5月17日。
自从JDK 1.3开始,Sun维持了一个习惯:大约每隔两年一个JDK的主版本,以动物命名,期间的各个修正版本则以昆虫作为工程名称。
2002年2月13日,JDK 1.4,工程代号为Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一个版本,Compaq、Fujitsu、SAS、Symbian、IBM等著名公司都有参与甚至实现自己独立的JDK 1.4。哪怕是在十多年后的今天,仍然有许多主流应用(Spring、Hibernate、Struts等)能直接运行在JDK 1.4之上,或者继续能运行在JDK 1.4上的版本。JDK 1.4同样了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器等。JDK 1.4有两个后续修正版:2002年9月16日的工程代号为Grasshopper(蚱蜢)的JDK 1.4.1与2003年6月26日的工程代号为Mantis(螳螂)的JDK 1.4.2。
2002年前后还发生了一件与Java没有直接关系,但事实上对Java的发展进程影响很大的事件,那就是微软公司的.NET Framework了。这个无论是技术实现上还是目标用户上都与Java有很多相近之处的技术平台给Java带来了很多讨论、比较和竞争,.NET平台和Java平台之间声势浩大的孰优孰劣的论战到目前为止都在继续。
2004年9月30日,JDK 1.5,工程代号Tiger(老虎)。从JDK 1.2以来,Java在语法层面上的变换一直很小,而JDK 1.5在Java语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性都是在JDK 1.5中加入的。在虚拟机和API层面上,这个版本改进了Java的内存模型(Java Memory Model,JMM)、提供了java.util.concurrent并发包等。另外,JDK 1.5是官方声明可以支持Windows 9x平台的一个JDK版本。
2006年12月11日,JDK 1.6,工程代号Mustang(野马)。在这个版本中,Sun终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE、J2ME的命名方式,启用Java SE 6、Java EE 6、Java ME 6的命名方式。JDK 1.6的改进包括:提供动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)、提供编译API和微型HTTP服务器API等。同时,这个版本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。
在2006年11月13日的JavaOne大会上,Sun公司宣布最终会将Java开源,并在随后的一年多时间内,陆续将JDK的各个部分在GPL v2(GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code,这部分代码大多是Sun本身也无权限进行开源处理的)外,OpenJDK几乎包括了Sun JDK的全部代码,OpenJDK的质量主管曾经表示,在JDK 1.7中,Sun JDK和OpenJDK除了代码文件头的版权注释之外,代码基本上一样,所以OpenJDK 7与Sun JDK 1.7本质上就是同一套代码库开发的产品。
JDK 1.6以后,由于代码复杂性的增加、JDK开源、开发JavaFX、经济危机及Sun收购案等原因,Sun在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年一个主版本的发展速度。JDK 1.6到目前为止一共了37个Update版本,近期的版本为Java SE 6 Update 37,于2012年10月16日。
2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其及时个里程碑版本。根据JDK 1.7的功能规划,一共设置了10个里程碑。一个里程碑版本原计划于2010年9月9日结束,但由于各种原因,JDK 1.7最终无法按计划完成。
从JDK 1.7最开始的功能规划来看,它本应是一个包含许多重要改进的JDK版本,其中的Lambda项目(Lambda表达式、函数式编程)、Jigsaw项目(虚拟机模块化支持)、动态语言支持、GarbageFirst收集器和Coin项目(语言细节进化)等子项目对于Java业界都会产生深远的影响。在JDK 1.7开发期间,Sun公司由于相继在技术竞争和商业竞争中都陷入泥潭,公司的股票市值跌至仅有高峰时期的3%,已无力推动JDK 1.7的研发工作按正常计划进行。为了尽快结束JDK 1.7长期"跳票"的问题,Oracle公司收购Sun公司后不久便宣布将实行"B计划",大幅裁剪了JDK 1.7预定目标,以便保障JDK 1.7的正式版能够于2011年7月28日准时。"B计划"把不能按时完成的Lambda项目、Jigsaw项目和Coin项目的部分改进延迟到JDK 1.8之中。最终,JDK 1.7的主要改进包括:提供新的G1收集器(G1在时依然处于Experimental状态,直至2012年4月的Update 4中才正式"转正")、加强对非Java语言的调用支持(JSR-292,这项特性到目前为止依然没有实现定型)、升级类加载架构等。
到目前为止,JDK 1.7已经了9个Update版本,近期的Java SE 7 Update 9于2012年10月16日。从Java SE 7 Update 4起,Oracle开始支持Mac OS X操作系统,并在Update 6中达到支持的程度,同时,在Update 6中还对ARM指令集架构提供了支持。至此,官方提供的JDK可以运行于Windows(不含Windows 9x)、Linux、Solaris和Mac OS平台上,支持ARM、x86、x64和Sparc指令集架构类型。
2009年4月20日,Oracle公司宣布正式以74亿美元的价格收购Sun公司,Java商标从此正式归Oracle所有(Java语言本身并不属于哪间公司所有,它由JCP组织进行管理,尽管JCP主要是由Sun公司或者说Oracle公司所领导的)。由于此前Oracle公司已经收购了另外一家大型的中间件企业BEA公司,在完成对Sun公司的收购之后,Oracle公司分别从BEA和Sun中取得了目前三大商业虚拟机的其中两个:JRockit和HotSpot,Oracle公司宣布在未来1~2年的时间内,将把这两个的虚拟机互相取长补短,最终合二为一。可以预见在不久的将来,Java虚拟机技术将会产生相当巨大的变化。
根据Oracle官方提供的信息,JDK 1.8的及时个正式版本将于2013年9月,JDK 1.8将会提供在JDK 1.7中规划过,但最终未能在JDK 1.7中的特性,即Lambda表达式、Jigsaw(很不幸,随后Oracle公司又宣布Jigsaw在JDK 1.8中依然无法完成,需要延至JDK 1.9)和JDK 1.7中未实现的一部分Coin等。
在2011年的JavaOne大会上,Oracle公司还提到了JDK 1.9的长远规划,希望未来的Java虚拟机能够管理数以GB计的Java堆,能够更高效地与本地代码集成,并且令Java虚拟机运行时尽可能少人工干预,能够自动调节。
1.4Java虚拟机发展史
上一节我们从整个Java技术的角度观察了Java技术的发展,许多Java程序员都会潜意识地把它与Sun公司的HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和IBM J9,但对JVM的认识不仅仅只有这些。
从1996年初Sun公司的JDK 1.0中所包含的Sun Classic VM到今天,曾经涌现、湮灭过许多或经典或或有特色的虚拟机实现,在这一节中,我们先暂且把代码与技术放下,一起来回顾一下Java虚拟机家族的发展轨迹和历史变迁。
1.4.1Sun Classic / Exact VM
以今天的视角来看,Sun Classic VM的技术可能很原始,这款虚拟机的使命也早已终结。但仅凭它"世界上及时款商用Java虚拟机"的头衔,就足够有让历史记住它的理由。
1996年1月23日,Sun公司JDK 1.0,Java语言首次拥有了商用的正式运行环境,这个JDK中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用JIT编译器,就必须进行外挂。但是假如外挂了JIT编译器,JIT编译器就接管了虚拟机的执行系统,解释器便不再工作了。用户在这款虚拟机上执行java -version命令,将会看到类似下面这行输出:
java version "1.2.2"
Classic VM (build JDK-1.2.2-001, green threads, sunwjit)
其中的"sunwjit"就是Sun提供的外挂编译器,其他类似的外挂编译器还有Symantec JIT和shuJIT等。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每一个方法、每一行代码都进行编译,而无论它们执行的频率是否具有编译的价值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术,因此这个阶段的虚拟机即使用了JIT编译器输出本地代码,执行效率也和传统的C/C++程序有很大差距,"Java语言很慢"的形象就是在这时候开始在用户心中树立起来的
这本书是一本好书一口气就看完了,但是!如果我不是看到这个是当当自营而且纸张质量这么好,我真的觉得这是盗版,书中明显有样例代码缺失,代码行数都印丢了,而且代码有的是短短续续的,关键的几行,作者详细讲的几行都不见了?我觉得这肯定不是出版社的锅,既然作者在讲肯定会印,至于原因我不想追问,就书而言是很好的一本书,就购物来讲,差。
近日一直在阅读这本书,书写的很棒,解开我很多开发过程中遇到的疑惑。 后来闲来无事 翻阅effective java这本书,竟然从中又感悟到很多,着实让我惊讶,非常推荐阅读
难得的Java虚拟机方面的好书,通俗易懂,平时对这块知识了解很薄弱的都能理解清楚了,但是又不会讲的很初级,是每个Java开发人员的必备秘籍,希望国人能够多出一些这样的好书!
深入理解java虚拟机,学java的必看。好书!!
不仅仅是javaer,其他想对虚拟机深入了解的,应该认真分析此书,当今最成熟的虚拟机实现之一
讲的java7不算新,不过讲解非常清晰,很受用!一本好书,好书一本!
纸质挺好的,学习虚拟机挺好的书。看了电子版的,回来买纸版的。
主要围绕hotspot虚拟机展开内容,讲的比较全面,难度不是很大,设置了一些实战环节相当不错,在国人写的书中算是相当难得了
国内很少Java虚拟机方面的介绍, 这本书让我了解了很多虚拟机的细节。
第一版的时候就看过,比较经典的一本书。介绍了java的内存模型,**收集算法,**收集器,jdk自带的常用工具的等,介绍的比较系统、详细。
JAVA虚拟机原理讲的非常好的书,经典之作,没的说。
看后对虚拟机有了进一步的理解,对自我优化这块还是很有借鉴价值的,甚至在编码层次也会有更多的帮助!
要学习java虚拟机的,可以研读下,最好结合jdk源码一起看
之前在JD买了三本技术书,感觉纸张薄,像是影印的,不像正版,这次选择在当当,拿到书翻开看,是书纸那种淡淡的黄色,同时很有质感,每一张纸显得很厚实,以后打算都优先在当当买。这次也是我很久以来写的一次评论,以前都是直接手机上确认收货就完了,这一次是真心想来评论的,说不清为什么,但就是由心而发的想
书非常好,很佩服作者对jvm的全面了解。内容讲的很深,需要有一定的开发经验以及对计算机底层的了解才能很好的适应这本书,我看到后面半本书也是有些看不懂了。
很好的一本书,把整个Java虚拟机讲了一遍,做Java开发值得拥有,买过的计算机书这本最好
Java虚拟机,Java学习进阶嘞书籍,暂时看不懂,先学好基础
对JAVA内存溢出做了很详细的分析,正好能解决我现在的问题
Java程序员必读经典,深入理解Java虚拟机,也是各种大牛推荐过的,趁着这次活动,果断出手,很喜欢
买了读了第二章,加深了对虚拟机的了解,看起来比较流畅。
书是好书,印刷什么的都不错,没有去某宝买那18块钱的西贝货,特地来买正品,确实有这方面的保障,但是……书的右下角一大块被压出严重折痕变形,作为想买完美正品的人估计肯定会觉得有些不爽
一下子从当当买了三本书,这本书和并发编程,还有《Effective in java》,正在深读jvm,对理解虚拟机底层真的很有帮助,我会认真读完
这书是国内少有的描述JVM虚拟机原理的书籍,最大的特点是采用作者一贯的严谨而生动的语言,清楚地向读者描述虚拟机的机制、特性、原理以及实践,非常值得一看,比较推荐!
Java虚拟机学习不错的参考书,透彻深入,推荐!
Java程序员必读经典,深入理解Java虚拟机,也是各种大牛推荐过的,趁着这次活动,果断出手,很喜欢。
自认为是看过的有关虚拟机最好的一本书,解决了诸多一直以来困扰我的困惑,比如java对象在内存里的布局,访问方式等等,不错
我大学的时候曾经读过此书的第一版,对于书中讲解的JVM的只是非常痴迷,只可惜大学毕业书仍在北京了,最进发现此书出了第二版就立即买下来了,推荐所有和我一样想成为Java架构师的同行,一定要入手一本。
昨天早上9点开始派送的,然后下午打电话说今天送不了,没人送放假了。周一送,然后我今天中午打开软件一看,显示已经签收,问题是我一个电话也没有收到,我都不知道签收到哪去了,本来是一次愉快的购物!!!!!!!!!!!!
内容很不错,是国内少有的讲解Java虚拟机的书籍,值得开发者一看。
确为提升Java功力之良药,本书使自己对于虚拟机的运行机理与底层知识真正来了一次近距离接触,许多知识不再只是符号或文字的堆叠,而是一种真正地理解。不过深度上有些地方的确不如10年前出版的那本书,算是一点遗憾吧。