为什么对 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日【图灵教育】公众号文章。
为什么对 Java 性能调优最后都像在调 you?相关推荐
- 单机百万连接调优和 Netty 应用级别调优
单机百万连接调优和 Netty 应用级别调优 作者:Grey 原文地址: 博客园:单机百万连接调优和 Netty 应用级别调优 CSDN:单机百万连接调优和 Netty 应用级别调优 说明 本文为深度 ...
- JVM调优三板斧,快速掌握调优的核心与思路
如何从调优小白走向调优高手 说起JVM调优,大伙儿可能瞬间头皮发麻."好家伙,和调优沾边儿的事儿,不是我这个段位的小新手能解决的". 于是赶紧找来了技术大拿,看大拿三下五除二排查出 ...
- spark调优(一)-开发调优,数据倾斜,shuffle调优
主要分为开发调优.资源调优.数据倾斜调优.shuffle调优几个部分. 开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础:数据倾斜调优,主要讲解了一套 ...
- JVM调优总结(五)-调优方法(转载)
JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...
- lamp mysql大小限制_LAMP 调优之:MySQL 服务器调优
关于 MySQL 调优 有 3 种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为: 替换有问题的硬件. 对 MySQL 进程的设置进行调优. 对查询进行优化. 替换有问题的硬件通常是我 ...
- JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧
文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...
- JVM调优总结(十)-调优方法
JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...
- JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!
文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...
- 过拟合与模型调优(part1)--过拟合,模型调优,数据分割
学习笔记,仅供参考,有错必纠 PS : 本BLOG采用中英混合模式,有些英文下有中文翻译 文章目录 名词解释 模型调优 过拟合问题 模型调优 数据分割 名词解释 模型调优 we will assume ...
最新文章
- 协议模型的最底层是_CAN通信协议栈(二) 之对ISO11898-1的理解
- 在leangoo中如何做好需求管理(研发效能)
- linux program HEAP tracker
- php 内容自动生成word文档,php生成word文档的例子
- 开源 java CMS - FreeCMS2.8 栏目页静态化参数
- Java线程:线程的调度-优先级
- mysql redis hbase_MySQL之基本介绍
- ngnix 负载均衡原理
- MySQL存储过程的使用
- [转载]oracle定时器
- 无锡给的sql excel转换
- LightOJ 1245 - Harmonic Number (II)
- [转]如何阅读systemstate dump
- 交通流理论学习(Introduciton)
- Drill模块——孔加工与螺纹铣削
- 金蝶K3 各种单据及各种控制功能表的关系
- 【数据结构(郝斌)】01-数据结构概述
- ps怎么抠地图线路_怎样在PS里画地图的边界线?
- html站点文件命名规范,HTML制作中的文件夹及文件命名规范(二)
- 国产系统之光deepin之Java开发环境安装实录
热门文章
- video 微信 标签层级过高_基于大数据的用户标签体系建设思路和应用
- python postmessage_解惑:Postmessage函数模拟鼠标单击指定坐标
- 移动端video隐藏进度条_机器学习模型部署--打通前后端任督二脉
- bat 两个文本字符替换_数据人必会的Excel|掌握这些文本函数,让你的工作如鱼得水...
- bootstrap3 表单构建器_实例演示:如何构建高可用的微服务架构
- 计算机房做法图集,万科建筑标准工程做法通用图集(全套)
- 报名软件批次分类code不能为空_技能鉴定报名软件使用说明
- 从放弃到入门-Yaf(框架生成)
- __block的初步用法
- jquerymobile知识点三:弹出层popup