
对于程序员和架构师来说,Java系统的性能优化是一个超常规的挑战。这是因为Java语言和Java运行平台,以及Java生态的复杂性决定了Java系统的性能优化不再是简单的升级配置或者简单的 "空间换时间”的技术实现,这涉及Java的各种知识点,如编写高性能Java代码,Java代码的编译优化,运行时刻的JIT优化,JVM的内存管理优化等,还包括如何使用高性能的第三方开源工具,以及微服务和分布式系统设计需要关注的性能事项。 本书从高性能、易维护、代码增强,以及在微服务系统中编写Java代码的角度来描述如何实现高性能Java系统。书中的大部分例子都是作者从事Java开发20年来,在头部IT企业的高并发系统中摘录而来的,极具参考意义。
前言 每个公司都要求程序员写出性能良好、维护性强的代码,各种高端职位的任职要求也会把性能优化技能作为必选要求之一。当业务系统重构时,以及各种互联网大促前,也都期望系统的性能和吞吐量变得更好。近几年,很多企业从粗放式的系统设计和实现转成更为精细化的开发和优化系统。当我正在撰写前言的时候,特斯拉CEO马斯克刚收购推特,亲自与推特员工在深夜讨论分布式缓存方案,以减少网络调用,也同员工讨论如何减少渲染首页带来的后台近千次的微服务调用。在我从业的20多年里,遇到过多次类似提升系统性能、减少使用主机数量的挑战。在京东工作的时候,通过代码优化,电商基础交易系统某接口的性能提高了40%,吞吐量也相应地提高了。我目前所工作的物联网企业,也通过Java性能优化,使得企业的微服务系统每年节省了近百万元的主机费用,并且让物联云更快地响应设备命令。更早的时候作为惠普架构师,在移动集团的大型机机房呆了2个月,优化了公司自研的消息系统的设计方案和代码,使得该方案的性能和可靠性接近一流消息中间件。 本书介绍了Java系统性能优化的方方面面,涉及高质量代码的编写、性能优化技巧、高性能第三方工具的使用,以及Java自身的编译优化、JIT优化和JVM优化。本书的风格偏实战,读者可以下载书中的示例代码并运行测试。读者可以从任意一章开始阅读,掌握性能优化知识为公司的系统所用。 本书针对2019年出版的《Java系统性能优化实战》进行了修订,调整了大约三分之一的内容,具体修订内容如下: ?增加了“JVM调优”一章,通俗地解释了Java自动内存管理,包含了4个内存故障例子,以及内存调优最佳实践。 ?“Java字节码”一章新增了部分内容。比如通过字节码说明字符串拼接性能差异的原因,Log框架的API不推荐使用可变数组的原因。 ?“JIT优化”一章增加了Java编译内容,如何使用JavaCompiler编译源码,以及此过程中的Java语法糖的处理逻辑。 ?“可读性代码”一章增加了String使用不当的案例。 ?“代码审查”一章增加了缩短UUID、任务执行中断、日志框架最佳实践等内容。 ?去掉了“Java注释规范”一章。 ?去掉了“JSR269编译时增强”一章,因此第5章的高性能对象映射工具Selam(MapStrtus)的实现方法将缺少补充说明。感兴趣的读者可以从本书源码中获得JSR269实现的类似的例子和JSR269说明。 ?“高性能工具”一章对相关工具的最新版本的特性做了补充说明,比如,在《Java系统性能优化实战》一书中,测试的Fastjson的性能低于Jackson,但这次基于最新版本的Fastjson,测试的Fastjson的性能略高于Jackson。 ?第1到第4章增加了大量实战内容,比如介绍了高并发下UUID阻塞系统的解决办法,如何辨别重量级对象,如何复用重量级对象,另外补充了通过位运算提高性能的例子等。 ?把《Java系统性能优化实战》附录中的OQL查询语言内容精简后放到了JVM调优章节中。 书中部分内容会出现交叉引用,比如在4.18节介绍可变数组的时候,提出了Log框架是基于性能考虑才并不完全使用可变数组作为参数的。 public void info(String format, Object arg1) {} public void info(String format, Object arg1, Object arg2) {} public void info(String format, Object... argArray) {} 在9.2.5节中,进一步针对这三个方法的调用做了字节码分析,说明了调用可变数组需要构造临时数组,需要更多的字节码和空间,性能较差。 ANEWARRAY java/lang/Object DUP ICONST_0 LDC "a" AASTORE DUP ICONST_1 LDC "b" AASTORE INVOKEVIRTUAL com/ibeetl/com/ch09/HelloWorld.info (Ljava/lang/String;[Ljava/lang/Object;)V 这样的交叉引用在编写本书的时候难以避免,建议读者先将结论记录下来,待阅读到引用章节的时候再回顾此知识点。 内容介绍 本书分为5部分,共10章。 第1部分是第1章到第5章,第1章通过一个不超过10行的代码优化示例介绍如何对Java系统进行优化,如何使用JMH验证性能优化;第2章和第3章介绍JDK的核心类String、Number和并发包;第4章通过20多个优化技巧来说明Java性能优化的各种方法;第5章介绍了常用的高性能工具,如Caffeine、Jackson、HikariCP,并对其高性能的原因做了一定的源码解析。 第2部分是第6章,这部分强调编写易于阅读的代码,会从代码分解、面向对象、注释三方面进行讲解。容易阅读的代码是系统性能优化的前提。代码不容易被看懂,系统优化或者系统重构就非常困难。 第3部分是第7章,介绍Java编译和JIT优化。JIT优化对Java系统运行有深刻的影响,本章系统介绍了Java编译、JIT编译器、代码缓存、内联等知识。 第4部分是第8章,包含30多个具有“坏味道”的代码片段,读者可以放松身心,尝试优化代码。读者可以直接跳到这一章先尝试一下是否能改良这些具有“坏味道”的代码片段。 第5部分是第9章和第10章,第9章介绍Java字节码和ASM,用于运行时增强Java系统;第10章介绍JVM内存管理,并提供了内存使用的建议。 本书的每一章都可以扩展成一本书,但由于写作难度极大,本人水平有限,本书只保留了我认为最重要的内容。 致谢 首先感谢我的妻子苗珺对我写书的大力支持,这是我写的第三本技术书了,每一本的写作给我的感觉无异于一次加班熬夜的项目冲刺。没有她的支持,我是不可能全身心投入来完成写作。 其次感谢电子工业出版社的编辑给予我绝对的信任和支持,编辑对本书的出版做了非常多的指导,我们配合默契,感谢你们付出的辛勤汗水。 最后要感谢的是同事和开源社区的一些朋友,他们对本书写作提供了很多帮助,分别是同事蔺瑶南、张世敏,开源社区的王伯勋、杨代全、朱洛毅、曾超、李句,他们做了部分书稿的校验工作,非常感谢他们,如果没有他们,我是不可能及时完成本书写作的。 源码和个人公众号 读者既可以扫描封底二维码获取本书的相关源码,也可以进入我的微信公众号(闲谈Java开发)获取源码地址。 李家智