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

Posted JAVA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么对 Java 性能调优最后都像在调 you?相关的知识,希望对你有一定的参考价值。

不知道你有没有发现,优化Java,或者任何其他语言的代码性能经常被当做是一种暗黑艺术。
性能分析有种神秘感。画面类似是这样的:一个「黑客」经过多年练就的手艺,能够快速深入了解某个系统,并提出神奇的解决方案,10秒内就让计算机运行变得飞快。

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

从现实来看,性能分析更像是经验主义和心理学的一种奇妙组合。
重点在于,一方面是直观显示的指标数字,另一方面是用户和相关开发人员如何看待这些数字。

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

关于 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 运行如飞!在这本「山羊书」里聚焦了「好的性能工程」所涉及的各个方面:
• 整个软件生命周期内的性能方法论
• 适用于性能的测试理论
• 度量、统计和工具
• 分析技能(包括系统和数据)
• 底层的技术与机制

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

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

以上是关于为什么对 Java 性能调优最后都像在调 you?的主要内容,如果未能解决你的问题,请参考以下文章

一次性能测试调优过程记录

SparkStreaming 性能调优

JVM优化-上篇

浅谈Spark应用程序的性能调优

sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)

Java生产环境下性能监控与调优详解