为什么对 Java 性能调优最后都像在调 you?

不知道你有没有发现,优化Java,或者任何其他语言的代码性能经常被当做是一种暗黑艺术。

性能分析有种神秘感。画面类似是这样的:一个「黑客」经过多年练就的手艺,能够快速深入了解某个系统,并提出神奇的解决方案,10秒内就让计算机运行变得飞快。

从现实来看,性能分析更像是经验主义和心理学的一种奇妙组合。

重点在于,一方面是直观显示的指标数字,另一方面是用户和相关开发人员如何看待这些数字。

正是由于这种加入了主观判断的属性,也导致开发人员在面对性能分析时,容易寻求「灵丹妙药和心法秘籍 」。

关于 Java 性能的一些误解

很多年了,如果用 Google 搜索“Java 性能调优”,搜索权重最高、最热门的文章之一是在 1997 年到 1998 年左右发表的文章。

这个页面之所以一直在搜索结果中排在前列,是因为它在发布后初始排名比较高,带来了很多访问,而这些访问又反过来提升了它的排名。

但这个页面上提供的建议已经完全过时,不再成立,很多情况下甚至对应用程序会起到反作用。

但是因为这个页面在搜索结果中的权重高,展示位置靠前,很多开发人员都有可能受到这些过时建议的影响。

举个例子,在很早的 Java 版本中,方法分派性能很差。作为权宜之计,有些 Java 开发人员提倡避免编写小方法,而建议编写大方法。当然,随着技术的发展,虚方法分派的性能已经得到极大提升。

另外,借助 Java 虚拟机,特别是自动内联机制,目前大部分调用点已经消除了虚方法分派。按照“把所有东西集中到一个方法中”这个建议编写的代码处于很大的劣势,因为它对JIT编译器很不友好。

虽然没有明确的数据能统计出,这种糟糕的建议会给应用程序的性能带来多少不利影响,但也清楚地说明了,不使用量化和可验证的方式来优化性能是有害的。这也反映出,对于互联网上的一些“坊间传说”, 不可盲目轻信。 

「Java 实际上是一门蓝领语言」

这句话出自 Java 之父 James Gosling 。也就是说,Java 一直是一种极其实用的语言。它一开始对性能的态度是,只要环境足够快并且能提升开发效率,就可以牺牲原始性能。所以直到近几年,随着 HotSpot 之类的 JVM 的成熟和进步,Java 环境才开始适合于高性能计算应用程序。

这种实用性在 Java 平台中以多种方式体现出来,但最明显的一点就是使用了托管子系统。它的理念是,开发者不需要担心托管环境下的某些功能细节,而代价是放弃对底层的一些控制。

最明显的例子当然是内存管理。JVM 以可插拔垃圾收集子系统的形式提供自动内存管理,所以程序员不必手动跟踪内存。 

但和大多数现代软件系统一样,Java/JVM 软件栈非常复杂。实际上,因为 JVM 具有高度优化和自适应的特性,所以构建在 JVM 上的生产系统有时会表现出非常微妙而且复杂的性能行为。 

由于这些复杂的性能行为,JVM 性能调优实际上是技术、方法论、可测的量和工具的综合。换句话说,性能是一门实验科学,它通过下面这些方式实现预期结果:

• 定义期望的结果

• 测量现有系统

• 确定要实现需求所需的工作

• 开始某个改进操作

• 重新测试

• 确定目标是否实现

确定应该测量什么并记录这些目标非常重要,而它们也是确定项目工具和可交付成果的一部分。

所以,性能分析是建立在定义和实现非功能性需求的基础之上的。这个过程不能靠猜测和坊间传说完成。 

那到底有没有什么普适性调优的技法?

最佳性能调优的方法

技术的问题在于,它总是在革自己的命。随着 JIT 和垃圾收集技术的改进,优化应用程序性能的路径也越来越难以捉摸。即使 JVM 可以优化我们的代码,并且让对象几乎没什么成本,但应用程序和用户的需求也在持续增长。

有些时候,甚至是大部分时候,“好的”编码模式盛行:小方法会恰当内联,接口和类型检查成本变低,JIT 编译器生成的原生代码紧凑又高效。

但是其他时候,考虑到编译器和 CPU 的限制,我们需要手动调整代码,改变抽象和架构。有些时候,对象几乎是没什么成本的,都不用考虑我们会消耗内存带宽和垃圾收集周期。

其他时候,我们要处理 TB 甚至更大规模的数据集,这时候即使是最好的垃圾收集器和内存子系统,也要承受很大压力。

实际上,解决性能问题的答案是你要了解你的工具

也就是说你不但要了解 Java 语言是如何工作的,还要知道 JVM 类库、内存、编译器、垃圾收集器和应用程序运行所在的硬件是如何交互的。

所有的性能问题都没有单一的解决方案,而是有很多解决方案。技巧就是找到那些方案,并把最能满足要求的拼凑起来。

而现在,你即将拥有一个应对复杂性能的秘密武器,就是下面这本《Java性能优化实践:JVM调优策略、工具与技巧》。

这是一本可以当做字典翻的Java性能调优策略大全。你可以学习到如何平衡应用程序的设计和可用的资源,如何监控和调优 JVM,如何利用比老旧的类库和模式更高效的最新 Java 技术,如何让 Java 运行如飞!在这本「山羊书」里聚焦了「好的性能工程」所涉及的各个方面:

• 整个软件生命周期内的性能方法论

• 适用于性能的测试理论

• 度量、统计和工具

• 分析技能(包括系统和数据)

• 底层的技术与机制

这不是一本代码性能技巧手册,但全部是启发式的代码级优化技术。

本书的原版在亚马逊上也获得了众多 5 星好评,现在中文版终于来跟大家见面了!还有 InfoQ 技术大会主编,臧秀涛、唯品会资深架构师 ,江南白衣(肖桦)的联袂推荐!更特别的是,你还可以提前纸书上市一个月先睹为快书中的内容,原价164 的【纸质书】+【电子书】12月20日前,购买抢读活动只需要 88 元,还有免单机会!

????  ????  ????

活动 

11月11日当天,我们将从已购抢读订单中,随机抽选 3 个幸运订单免费赠送抢读名额,全额返还支付费用~ 中奖名单见12日【图灵教育】公众号文章。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值