不知道你有没有发现,优化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?相关推荐

  1. 单机百万连接调优和 Netty 应用级别调优

    单机百万连接调优和 Netty 应用级别调优 作者:Grey 原文地址: 博客园:单机百万连接调优和 Netty 应用级别调优 CSDN:单机百万连接调优和 Netty 应用级别调优 说明 本文为深度 ...

  2. JVM调优三板斧,快速掌握调优的核心与思路

    如何从调优小白走向调优高手 说起JVM调优,大伙儿可能瞬间头皮发麻."好家伙,和调优沾边儿的事儿,不是我这个段位的小新手能解决的". 于是赶紧找来了技术大拿,看大拿三下五除二排查出 ...

  3. spark调优(一)-开发调优,数据倾斜,shuffle调优

    主要分为开发调优.资源调优.数据倾斜调优.shuffle调优几个部分. 开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础:数据倾斜调优,主要讲解了一套 ...

  4. JVM调优总结(五)-调优方法(转载)

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  5. lamp mysql大小限制_LAMP 调优之:MySQL 服务器调优

    关于 MySQL 调优 有 3 种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为: 替换有问题的硬件. 对 MySQL 进程的设置进行调优. 对查询进行优化. 替换有问题的硬件通常是我 ...

  6. JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧

    文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...

  7. JVM调优总结(十)-调优方法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  8. JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!

    文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...

  9. 过拟合与模型调优(part1)--过拟合,模型调优,数据分割

    学习笔记,仅供参考,有错必纠 PS : 本BLOG采用中英混合模式,有些英文下有中文翻译 文章目录 名词解释 模型调优 过拟合问题 模型调优 数据分割 名词解释 模型调优 we will assume ...

最新文章

  1. 协议模型的最底层是_CAN通信协议栈(二) 之对ISO11898-1的理解
  2. 在leangoo中如何做好需求管理(研发效能)
  3. linux program HEAP tracker
  4. php 内容自动生成word文档,php生成word文档的例子
  5. 开源 java CMS - FreeCMS2.8 栏目页静态化参数
  6. Java线程:线程的调度-优先级
  7. mysql redis hbase_MySQL之基本介绍
  8. ngnix 负载均衡原理
  9. MySQL存储过程的使用
  10. [转载]oracle定时器
  11. 无锡给的sql excel转换
  12. LightOJ 1245 - Harmonic Number (II)
  13. [转]如何阅读systemstate dump
  14. 交通流理论学习(Introduciton)
  15. Drill模块——孔加工与螺纹铣削
  16. 金蝶K3 各种单据及各种控制功能表的关系
  17. 【数据结构(郝斌)】01-数据结构概述
  18. ps怎么抠地图线路_怎样在PS里画地图的边界线?
  19. html站点文件命名规范,HTML制作中的文件夹及文件命名规范(二)
  20. 国产系统之光deepin之Java开发环境安装实录

热门文章

  1. video 微信 标签层级过高_基于大数据的用户标签体系建设思路和应用
  2. python postmessage_解惑:Postmessage函数模拟鼠标单击指定坐标
  3. 移动端video隐藏进度条_机器学习模型部署--打通前后端任督二脉
  4. bat 两个文本字符替换_数据人必会的Excel|掌握这些文本函数,让你的工作如鱼得水...
  5. bootstrap3 表单构建器_实例演示:如何构建高可用的微服务架构
  6. 计算机房做法图集,万科建筑标准工程做法通用图集(全套)
  7. 报名软件批次分类code不能为空_技能鉴定报名软件使用说明
  8. 从放弃到入门-Yaf(框架生成)
  9. __block的初步用法
  10. jquerymobile知识点三:弹出层popup