Java性能优化实践:JVM调优策略、工具与技巧

Book description

在当前的互联网开发模式下,系统访问量日增、代码臃肿,各种性能问题纷至沓来。性能优化作为一个常谈常新的话题,受到越来越多开发者的关注。而Java是一门使用广泛的语言,社区生态中积攒了大量宝贵的性能优化经验。

作为一本性能调优方面的实用指南,本书从实验科学的角度将JVM调优的技术原理与方法论相结合,并在此基础上提供了可选择的工具。通过对各方面的深入研究,本书能让使用复杂技术栈的中高级Java技术专家以量化和可验证的方法优化Java应用程序性能。

  • 了解Java的原则和技术如何充分利用现代硬件和操作系统
  • 探究一些性能测试以及困扰团队的常见反模式
  • 理解测量Java性能数据的陷阱以及微基准测试的缺点
  • 深入研究JVM垃圾收集日志、监控、调优和工具
  • 探究JIT编译和Java语言性能技术
  • 学习Java集合类API与性能有关的方面,从整体上理解Java并发

Table of contents

  1. 封面
  2. 扉页
  3. 版权
  4. 版权声明
  5. O’Reilly Media, Inc.介绍
  6. 目录 (1/2)
  7. 目录 (2/2)
  8. 中文版推荐序一
  9. 中文版推荐序二
  10. 前言
    1. 排版约定
    2. O’Reilly在线学习平台(O’Reilly Online Learning)
    3. 使用代码示例
    4. 联系我们
    5. 致谢
    6. 电子书
  11. 第1章 明确优化与性能
    1. 1.1 关于Java性能的误解
    2. 1.2 Java性能概览
    3. 1.3 作为实验科学的性能
    4. 1.4 性能分类方法
      1. 1.4.1 吞吐量
      2. 1.4.2 延迟
      3. 1.4.3 容量
      4. 1.4.4 利用率
      5. 1.4.5 效率
      6. 1.4.6 可扩展性
      7. 1.4.7 降级
      8. 1.4.8 各种性能观测之间的关联
    5. 1.5 阅读性能图
    6. 1.6 小结
  12. 第2章 JVM概览
    1. 2.1 解释和类加载
    2. 2.2 执行字节码
    3. 2.3 HotSpot简介
    4. 2.4 JVM内存管理
    5. 2.5 线程和Java内存模型
    6. 2.6 认识不同的JVM
    7. 2.7 JVM的监控和工具
    8. 2.8 小结
  13. 第3章 硬件与操作系统
    1. 3.1 现代硬件简介
    2. 3.2 内存
    3. 3.3 现代处理器特性
      1. 3.3.1 翻译后备缓冲器
      2. 3.3.2 分支预测和推测执行
      3. 3.3.3 硬件存储器模型
    4. 3.4 操作系统
      1. 3.4.1 调度器
      2. 3.4.2 时间问题
      3. 3.4.3 上下文切换
    5. 3.5 一个简单的系统模型
    6. 3.6 基本探测策略
      1. 3.6.1 利用CPU
      2. 3.6.2 垃圾收集
      3. 3.6.3 I/O
      4. 3.6.4 机械共鸣
    7. 3.7 虚拟化
    8. 3.8 JVM和操作系统
    9. 3.9 小结
  14. 第4章 性能测试模式与反模式
    1. 4.1 性能测试的类型
      1. 4.1.1 延迟测试
      2. 4.1.2 吞吐量测试
      3. 4.1.3 负载测试
      4. 4.1.4 压力测试
      5. 4.1.5 耐久性测试
      6. 4.1.6 容量规划测试
      7. 4.1.7 退化测试
    2. 4.2 最佳实践入门
      1. 4.2.1 自上而下的性能测试
      2. 4.2.2 创建一个测试环境
      3. 4.2.3 确定性能要求
      4. 4.2.4 Java特有的问题
      5. 4.2.5 将性能测试当作软件开发生命周期的一部分
    3. 4.3 性能反模式
      1. 4.3.1 厌倦
      2. 4.3.2 填充简历
      3. 4.3.3 同侪压力
      4. 4.3.4 缺乏理解
      5. 4.3.5 被错误理解的问题/不存在的问题
    4. 4.4 性能反模式目录
      1. 4.4.1 被热门技术分心
      2. 4.4.2 被简单分心
      3. 4.4.3 性能调优天才
      4. 4.4.4 按照坊间传说调优
      5. 4.4.5 把责任归咎给驴
      6. 4.4.6 忽略大局
      7. 4.4.7 用户验收测试环境就是我的计算机
      8. 4.4.8 类似生产环境的数据很难表示
    5. 4.5 认知偏差与性能测试
      1. 4.5.1 还原论思维
      2. 4.5.2 确认偏差
      3. 4.5.3 战争的迷雾(行动偏差)
      4. 4.5.4 风险偏差
      5. 4.5.5 埃尔斯伯格悖论
    6. 4.6 小结
  15. 第5章 微基准测试与统计
    1. 5.1 Java性能测量
    2. 5.2 JMH
      1. 5.2.1 不是万不得已,不要做微基准测试(一个真实的故事)
      2. 5.2.2 关于何时使用微基准测试的启发
      3. 5.2.3 JMH框架
      4. 5.2.4 执行基准测试
    3. 5.3 JVM性能统计
      1. 5.3.1 误差类型
      2. 5.3.2 非正态统计
    4. 5.4 统计的解释
    5. 5.5 小结
  16. 第6章 理解垃圾收集
    1. 6.1 标记和清除
    2. 6.2 HotSpot运行时
      1. 6.2.1 对象的运行时表示
      2. 6.2.2 GC根和Arena
    3. 6.3 分配与生命周期
    4. 6.4 HotSpot中的垃圾收集
      1. 6.4.1 线程本地分配
      2. 6.4.2 半空间收集
    5. 6.5 并行收集器
      1. 6.5.1 新生代并行收集
      2. 6.5.2 老年代并行收集
      3. 6.5.3 并行收集器的局限性
    6. 6.6 分配的作用
    7. 6.7 小结
  17. 第7章 垃圾收集高级话题
    1. 7.1 权衡与可插拔的收集器
    2. 7.2 并发垃圾收集理论
      1. 7.2.1 JVM安全点
      2. 7.2.2 三色标记
    3. 7.3 CMS
      1. 7.3.1 CMS是如何工作的
      2. 7.3.2 用于CMS的基本JVM标志
    4. 7.4 G1
      1. 7.4.1 G1堆布局和区域
      2. 7.4.2 G1算法设计
      3. 7.4.3 G1的各阶段
      4. 7.4.4 用于G1的基本JVM标志
    5. 7.5 Shenandoah
      1. 7.5.1 并发压缩
      2. 7.5.2 获取Shenandoah
    6. 7.6 C4(Azul Zing)
    7. 7.7 IBM J9中的均衡收集器
      1. 7.7.1 J9对象头
      2. 7.7.2 Balanced收集器的大数组
      3. 7.7.3 NUMA和Balanced收集器
    8. 7.8 遗留的HotSpot收集器
      1. 7.8.1 Serial和SerialOld
      2. 7.8.2 增量式CMS
      3. 7.8.3 已被废弃和删除的垃圾收集组合
      4. 7.8.4 Epsilon
    9. 7.9 小结
  18. 第8章 垃圾收集日志、监控、调优及工具
    1. 8.1 认识垃圾收集日志
      1. 8.1.1 开启垃圾收集日志记录
      2. 8.1.2 垃圾收集日志与JMX的对比
      3. 8.1.3 JMX的缺点
      4. 8.1.4 垃圾收集日志数据带来的好处
    2. 8.2 日志解析工具
      1. 8.2.1 Censum
      2. 8.2.2 GCViewer
      3. 8.2.3 对于同一数据的不同可视化效果
    3. 8.3 基本垃圾收集调优
      1. 8.3.1 理解分配行为
      2. 8.3.2 理解暂停时间
      3. 8.3.3 收集器线程和GC根
    4. 8.4 调优Parallel GC
    5. 8.5 调优CMS
    6. 8.6 调优G1
    7. 8.7 jHiccup
    8. 8.8 小结
  19. 第9章 JVM上的代码执行
    1. 9.1 字节码解释概览
      1. 9.1.1 JVM字节码
      2. 9.1.2 简单解释器
      3. 9.1.3 HotSpot特定细节
    2. 9.2 AOT编译和JIT编译
      1. 9.2.1 AOT编译
      2. 9.2.2 JIT编译
      3. 9.2.3 比较AOT和JIT
    3. 9.3 HotSpot JIT基础
      1. 9.3.1 Klass字、虚函数表和指针变换
      2. 9.3.2 JIT编译日志
      3. 9.3.3 HotSpot中的编译器
      4. 9.3.4 HotSpot中的分层编译
    4. 9.4 代码缓存
    5. 9.5 简单JIT调优
    6. 9.6 小结
  20. 第10章 理解即时编译
    1. 10.1 认识JITWatch
      1. 10.1.1 基本的JITWatch视图
      2. 10.1.2 调试JVM和hsdi
    2. 10.2 介绍JIT编译
    3. 10.3 内联
      1. 10.3.1 内联的限制
      2. 10.3.2 调优内联子系统
    4. 10.4 循环展开
    5. 10.5 逃逸分析
      1. 10.5.1 消除堆分配
      2. 10.5.2 锁与逃逸分析
      3. 10.5.3 逃逸分析的限制
    6. 10.6 单态分派
    7. 10.7 内部函数
    8. 10.8 栈上替换
    9. 10.10 核心库方法
      1. 10.10.1 内联方法的大小上限
      2. 10.10.2 编译方法的大小上限
    10. 10.9 再谈安全点
    11. 10.11 小结
  21. 第11章 Java语言性能技术
    1. 11.1 优化集合
    2. 11.2 针对列表的优化考虑
      1. 11.2.1 ArrayList
      2. 11.2.2 LinkedList
      3. 11.2.3 ArrayList与LinkedList的对比
    3. 11.3 针对映射的优化考虑
      1. 11.3.1 HashMap
      2. 11.3.2 TreeMap
      3. 11.3.3 缺少MultiMap
    4. 11.4 针对集的优化考虑
    5. 11.5 领域对象
    6. 11.6 避免终结化
      1. 11.6.1 血泪史:忘记清理
      2. 11.6.2 为什么不使用终结化来解决这个问题
      3. 11.6.3 try-with-resources
    7. 11.7 方法句柄
    8. 11.8 小结
  22. 第12章 并发性能技术
    1. 12.1 并行介绍
    2. 12.2 理解JMM
    3. 12.3 构建并发库
      1. 12.3.1 Unsafe
      2. 12.3.2 原子与CAS
      3. 12.3.3 锁和自旋锁
    4. 12.4 并发库总结
      1. 12.4.1 java.util.concurrent中的Lock
      2. 12.4.2 读/写锁
      3. 12.4.3 信号量
      4. 12.4.4 并发集合
      5. 12.4.5 锁存器和屏障
    5. 12.5 执行器和任务抽象
      1. 12.5.1 认识异步执行
      2. 12.5.2 选择一个ExecutorService
      3. 12.5.3 Fork/Join
    6. 12.6 现代Java并发
      1. 12.6.1 流和并行流
      2. 12.6.2 无锁技术
      3. 12.6.3 基于Actor的技术
    7. 12.7 小结
  23. 第13章 剖析
    1. 13.1 认识剖析
    2. 13.2 采样与安全点偏差
    3. 13.3 面向开发人员的执行剖析工具
      1. 13.3.1 VisualVM剖析器
      2. 13.3.2 JProfiler
      3. 13.3.3 YourKit
      4. 13.3.4 Java Flight Recorder和Java Mission Control
      5. 13.3.5 运维工具
    4. 13.4 现代剖析器
    5. 13.5 分配剖析器 (1/2)
    6. 13.5 分配剖析器 (2/2)
    7. 13.6 堆转储分析
    8. 13.7 小结
  24. 第14章 高性能日志和消息系统
    1. 14.1 日志
    2. 14.2 设计一个影响较低的日志记录器
    3. 14.3 使用Real Logic库实现低延迟
      1. 14.3.1 Agrona
      2. 14.3.2 Simple Binary Encoding
      3. 14.3.3 Aeron
      4. 14.3.4 Aeron的设计
    4. 14.4 小结
  25. 第15章 Java 9以及Java的未来方向
    1. 15.1 Java 9中小的性能增强
      1. 15.1.1 分段式代码缓存
      2. 15.1.2 紧凑的字符串
      3. 15.1.3 新的字符串连接
      4. 15.1.4 C2编译器的改进
      5. 15.1.5 新版G1收集器
    2. 15.2 Java 10和未来版本
      1. 15.2.1 新的发布流程
      2. 15.2.2 Java 10
    3. 15.3 Java 9及更高版本中的Unsafe
    4. 15.4 Valhalla项目和值类型
    5. 15.5 Graal和Truffle
    6. 15.6 字节码的未来方向
    7. 15.7 并发的未来方向
    8. 15.8 总结
  26. 作者简介
  27. 封面简介

Product information

  • Title: Java性能优化实践:JVM调优策略、工具与技巧
  • Author(s): Benjamin J. Evans, James Gough, Chris Newland
  • Release date: January 2021
  • Publisher(s): Posts & Telecom Press
  • ISBN: 9787115552334

You might also like

book

Java持续交付

by Daniel Bryant, Abraham Marín-Pérez

持续交付为业务的持续发展和整个软件的交付周期增加了巨大的价值,但是掌握这项技术就意味着普通开发人员要跳出舒适区,学习很多新技能。本书以实践为基础,作者Daniel Bryant和Abraham Marín-Pérez通过大量的实践指导,帮助Java开发人员掌握针对不同平台的架构设计、自动化质量保证,以及打包和部署的技巧。 你将获得一些理解核心概念的帮助,以及有助于向持续交付迁移的指导意见。 你将学会如何设计能在不同平台上持续交付Java应用程序的架构。 你将学会如何构建应用程序构件,包括胖JAR文件、虚拟机镜像,以及操作系统容器(Docker)镜像。 你将学会如何使用Jenkins、PMD和FindSecBug等持续集成工具自动化地进行代码质量检查。 你将学会如何创建一个复杂的构建管道,以及如何设计独立的部署和发布流程。 你将了解为什么功能测试和系统质量属性测试对于开发和交付非常重要。 你将学会如何在本地有效地构建和测试应用程序,以及监控生产环境中运行的应用程序。

book

成為卓越程式設計師的38項必修法則

by Pete Goodliffe

“本書會引發你對程式設計藝術與科學的熱情。Pete 知道:卓越的軟體,是優秀的人們盡最大努力所完成的。” -Lisa Crispin 《Agile Testing: A Practical Guide for Testers and Agile Teams》作者 如果你熱愛程式設計,想要提升自己的能力,那你就找到正確的資源了。《Code Craft …

book

Kafka权威指南

by Neha Narkhede, Gwen Shapira, Todd Palino

每个应用程序都会产生数据,包括日志消息、度量指标、用户活动记录、响应消息等。如何移动数据,几乎变得与数据本身一样重要。如果你是架构师、开发者或者产品工程师,同时也是Apache Kafka新手,那么这本实践指南将会帮助你成为流式平台上处理实时数据的专家。 本书由出身于LinkedIn的Kafka核心作者和一线技术人员共同执笔,详细介绍了如何部署Kafka集群、开发可靠的基于事件驱动的微服务,以及基于Kafka平台构建可伸缩的流式应用程序。通过详尽示例,你将会了解到Kafka的设计原则、可靠性保证、关键API,以及复制协议、控制器和存储层等架构细节。 了解发布和订阅消息模型以及该模型如何被应用在大数据生态系统中 学习使用Kafka生产者和消费者来生成消息和读取消息 了解Kafka保证可靠性数据传递的模式和场景需求 使用Kafka构建数据管道和应用程序的最佳实践 在生产环境中管理Kafka,包括监控、调优和维护 了解Kafka的关键度量指标 探索Kafka如何成为流式处理利器

book

软件开发实践:项目驱动式的Java开发指南

by Raoul-Gabriel Urma, Richard Warburton

如果你刚刚开始你的Java职业生涯,掌握当今的许多软件开发概念可能会让你不知所措。你是否应该学习面向对象的实践,比如测试驱动开发或者应用函数式编程思想?本书提供了一种综合的、项目驱动的方式,帮助你学习一些成为高效开发人员所需的核心主题。 作者在本书中向你展示了如何开发真实项目,并同时学习最佳实践。每一章会聚焦于一个项目,该项目从一个命令行批处理程序开始,然后发展成一个功能齐全的应用程序。如果能够编写基本的Java代码,那么你将学习先进的软件开发实践,以构建现代的、健壮的和可维护的Java软件。 通过阅读本书,你将能够: 了解编写可维护代码的核心设计原则。 增加代码库的灵活性,提升代码可维护性,以及处理异常。 理解如何应用耦合、内聚和SOLID原则。 使用测试驱动开发来处理新的设计问题。 从外到内思考:从全局转移到应用程序领域的核心。 了解函数式编程并学习如何在Java中使用它。