【Java二十周年】我比Java大10岁

      技术分享

     1991年,我7岁,刚刚步入学堂不到半年。而计算机在那个年代也是一个新奇的事物。可就在那样的环境中,Java已经有了萌芽。那一年,SUN公司启动绿色计划,打算发展一种可以在任何消费电子产品上运行的软件。但由于C++自身有很多不足,所以项目组决定自行开发一种新的语言Oak。最初,Oak应用于机顶盒,但是在当时市场不成熟的情况下,项目失败了。但Oak却得到了SUN领导的赏识,于是:

      1995年3月23日,在对Oak进行小规模改造后Java语言诞生了,并广泛应用于互联网领域。

一年后,在1996年,我很顺利得从小学毕业了。不过这不是重点,重点是在同一年里,Java也从SUN公司“小学毕业”。在那一年里,SUN首次对外发布了JDK1.0。当然这个时候,Java还很薄弱。大部分类库都不完善。支持Java运行的虚拟机是一款叫做Classic VM的虚拟机。

      光阴如梭,一晃6年过去了,在2002年,我进入大学学习。在同一年里,JDK 1.4发布了。在新的JDK中,彻底淘汰了古老的Classic VM虚拟机,使用Hotspot作为其默认虚拟机。也就是现在最常用的Java虚拟机。然后,此时,虽然我已经接触了VB 6.0、Pascal等语言,但对Java还是相当陌生的。

      大学里的学习是相当密集的。虽然前后接触了不少编程语言。但正式接触Java还是从大三开始。那时学校里安排了Java的必修课。由此,我和Java就此结缘。但那时,我并不喜欢Java。从我的眼光看,一门在控制台输出“Hello World”都要敲老长一段命令的语言能有什么前途?就如同现在大部分人抨击Java那罗里吧嗦的语法一样,那时,我更倾向于C的强大、VB的简明。

      虽然满肚子不喜欢Java,但作为一门必须课,是绝对不能怠慢的。否则文凭难保。为了学好Java。我买了一本《Java程序设计方法与实例》的书,这就是我第一本Java的书籍。这本书可以说并没有什么名气。和《Thinking in Java》之类的大牛比起来,可以说是弱爆了。但我对这本书的评价很高,因为它足够简单,明了。能够让初学者看得懂。而我却特别不喜欢《Thinking in Java》,说实话打开《Thinking in Java》这本砖头书,我就立马想睡觉。并不是因为里面的内容不好,而是语言文字实在太别扭了。

      2004年,也就是在我努力学习Java的这一年里。JDK 1.5发布了。不得不说,这个版本加入了很多引人注目的特性。大大简化了开发。比如,泛型,虽然Java对泛型的支持只停留在Java语言层面,但有总比没有好。这让我们可以更加愉快地阅读代码。此外,自动装箱和拆箱也省略了好多机械式的代码。注解可以让我们给类、字段或者方法附加新的活力。枚举使得Java可以写出更加优雅的代码。增强的for循环,让我们的程序更为简练。总之,我认为JDK 1.5绝对是一个里程碑意义的版本。它带给我们太多的惊喜。

      经过了2年的Java学习,在2006年,我光荣的本科毕业了。我的毕业设计是与设计模式相关的课题。由于一次偶然的机会,我接触到了设计模式,之后,就顺理成章得将它作为我的本科毕业论文。如果说设计模式是从建筑学中诞生的,是在C++中由GoF引入软件行业的,那它就是在Java中发扬光大的。很少有Java程序员不知道设计模式。那个时候,我手捧着阎宏的《Java与模式》,将那些设计模式和设计原则视为神一样的存在,神圣而不可侵犯的艺术巅峰。不知道现在还有多少人保持着我当时的想法。《Java与模式》虽然和《Thinking in Java》一样厚实,但是我并不会把它当做砖头,因为它的确带给我很多启发。

      就在我本科毕业的那年(2006年),JDK6 beta发布了。在JDK 6并没有像JDK 5那样带来翻天覆地的变化。但是带来的改进也是很可观的。比如,对脚本语言的整合支持、编译器API的访问等。这些对语言的灵活性都有了很大的提高。但对我来说,我认为最为重要的改进是对synchronize的性能优化。在JDK 1.5中,synchronize关键的性能比较差。这导致我们不得不弃用synchronize,而使用ReentrantLock来改善程序的性能。但这显然是很麻烦的。因为synchronize真是太好用了。而这个问题在JDK 6中得以解决。

      而就在这一年里,Java开源并建立了OpenJDK。这是绝对是有历史意义的重大事件。现在,在各大Linux发行版本中,默认安装的都是OpenJDK。其重要性也就不言而喻了。而此时,我也有幸开始了我的研究生学习生涯。

      2008年,我正热火朝天的干着我的硕士毕业设计。这是一个基于P2P平台的多Agent框架。当然了,这是用Java做的。从底层的P2P网络到上层的应用都是使用Java实现的。为了能让Agent做到在多个网络节点中迁移,执行,我开始涉足和关注一些Java中相对底层的技术。比如动态类加载、字节码等等。可以说,在这个时候,我才真正开始关注Java技术。很可惜,也许当时大数据和分布式计算并没有像现在这么火,也许是我太孤陋寡闻,无法意识到分布式计算的前景,这个分布式执行框架在我完成毕业设计后,也就长眠于我的硬盘中了。现在回想起来,还真是有些可惜。

      就在这一年,Oracle收购了BEA并将JRockit虚拟机收入囊中。但我对此却毫无感觉。

      2009年3月,我顺利从取得了硕士学位,并开始了我的第一份工作。很有幸,这也是一份与Java打交道的工作。而就在这一年,Oracle宣布收购SUN。这对我来说,对于每一个Java程序员和社区来说,都是一颗重磅炸弹。一个崇尚开源和自由的产品,居然被一家无情的商业化公司收购。这对于Java来说是好还是坏呢?同样令人担忧的,还有MySQL的前途。

     我很幸运进了一家氛围良好的公司。在老一辈工程师的带领下,我才能有更多的成长。在工作的几年中,也遇到了不少Java性能相关的问题。此时,我才开始涉足有关Java虚拟机的一些内部机制,比如GC、内存分布等。可以说,大部分与此相关的知识是在工作中不断积累的。

     2011年,JDK 7发布了。但是,非常遗憾的是,我们的应用还停留在JDK 6中。我相信,到目前为止,大部分既存系统可能使用的都是JDK 6。但版本迁移是一件大事,因为贸然进行大版本的改变,会给商业产品带来很高的风险,也意味着测试人员要进行更多的测试。因此,除非有非常强烈的需求,否则,大版本的迁移是非常谨慎的。那JDK 7究竟给我们带来了什么呢?当然有一些语法上的增强和改变,比如,支持字符串的switch、二进制整数的表示、支持多重异常捕获以及try-with-resources语句进行资源管理。以及引入了NIO2。更为重要的是正式启用了G1回收器。实际上G1在JDK6中就已经给出,但只是作为一个实验性产品。此外,根据我的测试,JDK 7较JDK 6相比,性能也有一定幅度的提升。

     同时,JDK6中令人恼火的String内存泄露也在JDK中被完美解决。因为JDK7重新实现了java.lang.String类。让它更加安全。字符串常量池也从JDK 6中的Perm区移到了堆中。这也是为将来彻底消灭Perm区做的一点小准备吧!

     在动态语言编程盛行的今天,Java也与时俱进,虽说臃肿的身躯被一些人指指点点,但是任何变化都是需要时间的,在JDK 7中,Java虚拟机引入了新的指令invokedynamic。用于支持动态调用。从此,动态语言在Java虚拟机上就能更好的工作了。

     2014年,JDK 8发布。毫无疑问,JDK 8最引入注意的就是对函数式编程的支持。我们可以看到,Java正在尽可能将自己变的更加完美,从此,Java也可以使用很少的语句做很多的事情了(但这究竟是好是坏还需要时间的检验)。函数式编程这个亮点实在是太亮了,以至于我们很容易忽视JDK 8带来的其它改进。比如,在JDK 8中,我们熟悉的Perm区被完全移除,取而代之的是称为元数据区的直接内存空间。同时JDK 8中还为并发做了很大的增强,比如加入了LongAdder类。这是一个性能完爆AtomicLong的并发工具类。这你能想象吗?

     追随Java这么多年,是不断的积累和学习让我得以和Java一起成长,这是我的幸运。Java不是完美的,就如同没有任何事物是完美的。但这并不妨碍我们去热爱一门技术,为了记录多年以来我对Java的所学、所思、所想,于是《实战Java虚拟机——JVM故障诊断与性能优化》诞生了,它出版时正值2015年,这一年,我30岁,Java 20岁,我比Java大10岁。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。