为什么对 Java 性能调优最后都像在调 you?
Posted JAVA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么对 Java 性能调优最后都像在调 you?相关的知识,希望对你有一定的参考价值。
不知道你有没有发现,优化Java,或者任何其他语言的代码性能经常被当做是一种暗黑艺术。
性能分析有种神秘感。画面类似是这样的:一个「黑客」经过多年练就的手艺,能够快速深入了解某个系统,并提出神奇的解决方案,10秒内就让计算机运行变得飞快。
从现实来看,性能分析更像是经验主义和心理学的一种奇妙组合。
重点在于,一方面是直观显示的指标数字,另一方面是用户和相关开发人员如何看待这些数字。
正是由于这种加入了主观判断的属性,也导致开发人员在面对性能分析时,容易寻求「灵丹妙药和心法秘籍 」。
很多年了,如果用 Google 搜索“Java 性能调优”,搜索权重最高、最热门的文章之一是在 1997 年到 1998 年左右发表的文章。
这个页面之所以一直在搜索结果中排在前列,是因为它在发布后初始排名比较高,带来了很多访问,而这些访问又反过来提升了它的排名。
但这个页面上提供的建议已经完全过时,不再成立,很多情况下甚至对应用程序会起到反作用。
但是因为这个页面在搜索结果中的权重高,展示位置靠前,很多开发人员都有可能受到这些过时建议的影响。
举个例子,在很早的 Java 版本中,方法分派性能很差。作为权宜之计,有些 Java 开发人员提倡避免编写小方法,而建议编写大方法。当然,随着技术的发展,虚方法分派的性能已经得到极大提升。
另外,借助 Java 虚拟机,特别是自动内联机制,目前大部分调用点已经消除了虚方法分派。按照“把所有东西集中到一个方法中”这个建议编写的代码处于很大的劣势,因为它对JIT编译器很不友好。
虽然没有明确的数据能统计出,这种糟糕的建议会给应用程序的性能带来多少不利影响,但也清楚地说明了,
不使用量化和可验证的方式来优化性能是有害的
。这也反映出,对于互联网上的一些“坊间传说”, 不可盲目轻信。
这句话出自 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
元,
还有免单机会!
以上是关于为什么对 Java 性能调优最后都像在调 you?的主要内容,如果未能解决你的问题,请参考以下文章
一次性能测试调优过程记录
SparkStreaming 性能调优
JVM优化-上篇
浅谈Spark应用程序的性能调优
sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)
Java生产环境下性能监控与调优详解