Java性能权威指南读书笔记一 导论

本书的主题

这是一本关于Java性能调优科学和艺术的书。

性能调优的科学

性能调优涉及大量数字,检测和分析工作。性能调优工程师大多就有科学背景,只有基于严谨的科学理论才能将性能发挥到极致。

性能调优的艺术

作者认为的一种艺术从根本上是建立在知识和经验的基础上。类似的,优秀性能工程师的工作就像是艺术,而这艺术正是深厚的知识,丰富的经验和敏锐的直觉。

本书的目标

不在上面说的经验和直觉,而是在于拓宽知识的宽度。

本书知识内容

  1. 如何对Java虚拟机自身的性能进行调优:即如何通过JVM的配置来影响程序的各种性能指标。
  2. 理解Java平台的特性对性能的影响。Java平台既指Java语言(线程和同步),也指Java标准API(例如XML解析性能)。虽然Java语言和Java API完全不是一回事,但本书不作严格区分。
    ps:JVM自身的性能很大程度上取决于调优标志,而Java平台的性能更多由在应用代码中采用最佳实践决定。

概述

第一章 通览
第二章 测试Java应用的方法,还包括基准测试的陷阱。
第三章 介绍监控Java应用的一些工具
第四章 JIT编译
第五章 垃圾回收
第六章 垃圾回收
--- Java平台部分 ---
第七章 Java堆内存的使用
第八章 本地内存的使用
第九章 线程性能调优
第十章 Java企业版 API
第十一章 JPA和JDBC
第十二章 Java SE API技巧

约定

本书讲的版本是Java 7和8.

JVM调优标志

除了少数意外,JVM主要接受两类标志:布尔标志和附带参数标志

布尔标志

语法:-XX:+FlagName表示开启,-XX:-FlagName表示关闭

附带参数

语法:-XX:FlagName=something
根据参数不同something不同。

查看标志默认值

添加 -XX:+Printflagsfinal(默认为false),就能获得具体运行环境中特定标志的默认值

JVM的不同版本

  1. client:
  2. server:
  3. 产品版(product):
  4. 调试版:
  5. 开发版:
    ps:不同的版本会有不同的JVM参数

全面的算法

更好的算法

Java很多细节都可以影响性能,但是更重要的是程序本身的性能是否符合要求。

编写更少的代码

要编译的代码越多,等待程序启动所耗费的时间就越长;
要创建和销毁的对象越多,垃圾收集的工作量就越大;
要分配和持有的对象越多,GC的周期就越长。
要从磁盘装载进JVM的类越多,程序启动所花费的时间就越长。
要执行的代码越多,机器硬件缓存的效率就越低
要执行的代码越多,花费的时间就越多
ps:这段只是相对意义上的,从某些方面来说代码应该替换成指令,执行的指令和程序的性能会有线性的关系。

常见的优化

  1. 借助性能分析来优化代码,重点关注性能分析中最耗时的操作。但是这并不意味着只分析性能中的叶子方法
  2. 利用奥卡姆剃刀原则诊断性能问题。而性能问题最可能的原因应该是最容易解释的;新代码比机器配置更可能引入性能问题,而机器配置比jvm或者操作系统的bug更容易引入性能问题。
  3. 为应用中常见的操纵编写简单算法。如果代码已经满足99%的用户,但是为了满足剩余的1%的用户需要改变代码让速度变慢,那么就是得不偿失的。

总结

大多数情况下,JVM性能优化只占系统的一小部分。数据库,IO,网络等方面的性能问题不亚于JVM。更重要的是编写简单,高效的代码。