本博客主要参考周志明老师的《深入理解Java虚拟机》第二版
读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。
《深入理解Java虚拟机》全书总结如下:
序号 | 内容 | 链接地址 |
---|---|---|
1 | 深入理解Java虚拟机-走近Java | https://blog.csdn.net/ThinkWon/article/details/103804387 |
2 | 深入理解Java虚拟机-Java内存区域与内存溢出异常 | https://blog.csdn.net/ThinkWon/article/details/103827387 |
3 | 深入理解Java虚拟机-垃圾回收器与内存分配策略 | https://blog.csdn.net/ThinkWon/article/details/103831676 |
4 | 深入理解Java虚拟机-虚拟机执行子系统 | https://blog.csdn.net/ThinkWon/article/details/103835168 |
5 | 深入理解Java虚拟机-程序编译与代码优化 | https://blog.csdn.net/ThinkWon/article/details/103835883 |
6 | 深入理解Java虚拟机-高效并发 | https://blog.csdn.net/ThinkWon/article/details/103836167 |
世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的程。
概述
Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这 个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,如图1-1所示。时至今日,Java技术体系已 经吸引了900多万软件开发者,这是全球最大的软件开发团队。使用Java的设备多达几十亿 台,其中包括11亿多台个人计算机、30亿部移动电话及其他手持设备、数量众多的智能卡, 以及大量机顶盒、导航系统和其他设备。
Java能获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外,还 有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了"一次编写 ,到处运行"的理想;它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问 题;它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增加而 获得更高的性能;它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三 方类库来帮助它实现各种各样的功能……Java所带来的这些好处使程序的开发效率得到了很 大的提升。作为一名Java程序员,在编写程序时除了尽情发挥Java的各种优势外,还应该去了解和思考一下Java技术体系中这些技术特性是如何实现的。认识这些技术运作的本质,是 自己思考"程序这样写好不好"的基础和前提。当我们在使用一种技术时,如果不再依赖书本和他人就能得到这些问题的答案,那才算上升到了"不惑"的境界。
本书将与读者一起分析Java技术中最重要的那些特性的实现原理。在本章中,我们将重点介绍Java技术体系内容以及Java的历史、现在和未来的发展趋势。
Java技术体系
从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序都 属于Java技术体系中的一员。如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:
- Java程序设计语言
- 各种硬件平台上的Java虚拟机
- Class文件格式
- Java API类库
- 来自商业机构和开源社区的第三方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 E d i t i o n ) : 支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
- Java EE ( Enterprise Edition): 支持使用多层架构的企业应用(如ERP、CRM应用)的 Java平台,除了提供Java SE API外 ,还对其做了大量的扩充- 并提供了相关的部署支持,这 个版本以前称为J2EE。
Java发展史
从第一个Java版本诞生到现在已经有18年的时间里。沧海桑田一瞬间,转眼18年过去了,在图1-3所展示的时间线中,我们看到JDK已经发展到了1.7版。在这18年里还诞生了无数和Java相关的产品、技术和标准。现在让我们走入时间隧道,从孕育Java语言的时代开始,再来回顾一下Java的发展轨迹和历史变迁。
具体可以参考我的这篇博客Java发展历程
Java虚拟机发展史
上一节我们从整个Java技术的角度观察了Java技术的发展,许多Java程序员都会潜意识地把它与Sun公司的HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和 IBM J9 ,但对JVM的认识不仅仅只有这些。
从1996年初Sun公司发布的JDK 1.0中所包含的Sun Classic VM到今天,曾经涌现、浬灭过许多或经典或优秀或有特色的虚拟机实现,在这一节中,我们先暂且把代码与技术放下,一 起来回顾一下Java虚拟机家族的发展轨迹和历史变迁。
- Sun Classic / Exact VM
- Sun HotSpot VM
- Sun Mobile-Embedded VM / Meta-Circular VM
- BEA JRockit / IBM J9 VM
- Azul VM / BEA Liquid VM
- Apache Harmony / Google Android Dalvik VM
- Microsoft JVM 及其他
展望Java技术的未来
在2005年,Java语言诞生10周年的SunOne技术大会上,Java语言之父James Gosling做了一场题为"Java技术下一个十年"的演讲。笔者不具备James Gosling博士那样高屋建瓴的视角 ,这里仅从Java平台中几个新生的但已经开始展现出蓬勃之势的技术发展点来看一下后续 1〜2个JDK版本内的一些很有希望的技术重点。
- 模块化,模块化是解决应用系统与技术平台越来越复杂,越来越庞大而产生的一系列问题的一个重要途径。最近几年OSGI技术的迅速发展正说明了通过模块化实现按需部署,降低复杂性和维护成本的需求是相当迫切的。
- 混合语言,今年原来越多语言运行在Java这个平台上,例如Groovy,JRuby,Clojure等。试想一下,在一个项目中,并行处理使用Clojure语言编写,展示层使用Jruby或Rails,中间层则是Java,每个应用层将使用不同的语言来完成,而且,接口对每一层的开发都是透明的,各种语言之间的交互不存在任何困难,因为它们最终都运行在一个虚拟机上。
- 多核并行,引入java.util.concurren包,能够轻松地利用多个CPU核心提供的计算资源完成一个复杂的计算任务。
- 进一步丰富语法,JDK不断升级改进语法。
- 随着主流的CPU开始支持64位架构,JAVA虚拟机也在很早之前就推出了支持64位系统的版本。
实战:自己编译JDK
想要一探 JDK 内部的实现机制,最便捷的路径之一就是自己编译一套 JDK 。通过阅读和跟踪调试 JDK 源码去了解 Java 技术体系的原理,虽然门槛会高一些,但肯定会比阅读各种文章、书籍更加容易切近本质。另外,JDK 中的很多底层方法都是 Native 的,当需要跟踪这些方法的运作或对 JDK 进行 Hack 的时候,都需要编译一套自己的 JDK 。
本章小结
本章介绍了 Java 技术体系的过去、现在和未来的发展趋势,并通过实践的方式介绍了如何自己来独立编译一个 OpenJDK 7。