1、第一章 java 性能调优概述1.1.2 性能的参考指标1.2.1 设计调优比如说如果 A 组件通过循环不断监控时间 E 是否发生,其必然会占用部分系统资源。但是可以通过 observer 模式解决:1.2.2 代码调优比如 linkedList 比 ArrayList 随机访问性能好。1.2.3 JVM 调优一般在开发后期做,比如内存结构,GC 种类。1.2.4 数据库调优比如大量的拥有相同结构的 SQL 查询,可以用 preparedStatement 代替 statement;指定要查询的列名,避免用“* ”。比如设置 oracle 的共享池、缓存区。1 .2.5 操作系统调优比如调整
2、unix 的共享内存值。第二章 设计优化2.1 设计模式2.1.1 单例模式对于频繁使用对象,因为 new 次数少,对内存使用不频繁,将减轻 GC 压力。2.1.2 代理模式可以实现比如延迟加载2.1.3 享元模式好处同单例模式2.1.5 观察者模式可以代替多线程。2.1.6 Value Object 一次封装所有的属性值,省得一次次请求属性值。2.1.7 Business Delegate代理类中一组远程方法调用构成一个业务流程,客户端调用代理类。2.2 常用优化组件2.2.1 缓冲缓冲是一块内存区域,目的是缓解应用程序上下层之间的性能差异。2.2.2 缓存也是一块内存区域,目的是暂存数据处
3、理结构,并供下次访问使用。也可用 ehCache 等框架2.2.3 对象复用池比如线程池和数据库连接池2.2.4 多线程2.2.5 负载均衡2.2.6 时间换空间比如少申请变量2.2.7 空间换时间比如用缓存第三章 java 程序优化3.3 使用 NIO 提升性能NIO 为所有的原始类型提供 buffer,NIO 是基于 Block 的,NIO 最重要的组件是 buffer 和Channel。 buffer 是一个连续的内存快,是 NIO 读写数据的中转池。通道表示缓冲数据的源头或者目的地,它是用于想缓存读取或写入数据,是访问缓冲的接口。3.4 使用软引用和弱引用3.5 有利于改善性能的技巧3
4、.5.1 慎用异常3.5.2 使用局部变量,因为局部变量是在 stack 中,比较快。3.5.3 位运算代替乘除法3.5.12 静态方法代替实例方法第四章 并行程序优化4.5 锁的优化4.5.7 ReentrantLock 重入锁4.5.9 自旋锁4.5.10 锁清除java 即时编译时,上下文扫描,去除不可能存在共享资源竞争的锁,这样可以节省毫无意义的请求锁时间4.5.11 锁偏向(biased)4.6 无锁例如 TreadLocal,和 CAS 算法(Compare and Swap)。4.6.3 Amino 是 apache 的项目,提供了一些线程安全的、基于无锁算法的数据结构例如 lo
5、ckFreeList.还内置了一些多线程调度模式(例如 Master-Worker 模式)。4.7 协程为了提高并发数量,对线程进一步分割。( 各种语言在实现 Coroutine 方式的支持时,多数都采用了 Actor Model 来实现,Actor Model 简单来说就是每个任务就是一个 Actor,Actor之间通过消息传递的方式来进行交互,而不采用共享的方式,Actor 可以看做是一个轻量级的进程或线程,通常在一台 4G 内存的机器上,创建几十万个 Actor 是毫无问题的。)第五章 JVM 调优5.3.10 CMS(Concurrent Mark Sweep)收集器,用标记-清除算法,同时使用多线程。5.3.10 G1 收集器,在吞吐量和停顿控制上好于 CMS.5.4 常用调优方法5.4.1 把新对象留在新生代。5.4.2 长命的大对象进入老年代,免得新生代老 GC5.4.4 稳定堆大小5.4.5 并行收集器适合吞吐量优先,可以减少 GC 的总时间。5.4.7 降低停顿,可以用 CMS 收集器和尽可能把对象预留在新生代。5.5 实用 JVM 参数5.5.1 JIT 5.5.4 打印 GC +PrintGC5.5.5 类和对象跟踪 总结第六章 java 性能调优工具6.1 linux 命令Nmon Axis 里看见各种性能6.3 JDK 命令行