--From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版)
1. java性能调优概述
1.1 性能概述
程序性能: 执行速度,内存分配,启动时间, 负载承受能力。
性能指标: 执行时间,CPU时间,内存分配,磁盘吞吐量,网络吞吐量,响应时间。
优化策略: 木桶原理,优化性能瓶颈。
1.2 性能调优的层次
设计调优,
代码调优,
JVM调优,
数据库调优,
操作系统调优。
2. 设计优化
2.1 善用设计模式
单例模式: 对于巨大对象,节省创建对象的时间空间;
代理模式: 可用于延迟加载,提升系统启动速度;
享元模式: 对象和组件复用,节省创建对象的开销;
装饰者模式: 分离组件,提高可维护性增加模块复用性;
观察者模式: 避免新开线程循环等待;
2.2 常用组件优化
缓冲(漏斗设计),
缓存(空间换时间),
对象复用“池”,
并行代替串行,
负载均衡(Terracotta),
时间换空间,
空间换时间。
3. Java程序优化
3.1 字符串
不变性, 针对常量池优化
subString 空间换取时间
split 正则分割
StringTokenizer 字符串分割
灵活使用charAt 和 indexOf
StringBuffer(线程安全) 和 StringBuilder : 初始化时设置最大容量
3.2 核心数据结构
List : ArrayList 和 LinkedList
Map : Hashtable(线程安全), HashMap, LinkedHashMap, TreeMap(可排序)
Set : hashSet, linkedHashSet, TreeSet
集合访问优化 :
分离循环中被重复调用的代码 ( i<collection.size() -> i<collectionSize )
省略相同的操作 (循环内部的声明)
减少方法调用 (优先直接访问内部变量)
RandomAccess (随即访问): ArrayList Vector
3.3 使用NIO提升性能
NIO的Buffer 和 Channel 配合使用
Buffer的原理和相关操作
Buffer内存缓存和堆上内存区别
3.4 引用类型
强引用 : 可以直接访问,不会被GC回收,可能导致内存泄露(互相引用)
软引用 : SoftReference<T> 内存紧张,会被GC回收
弱引用 : WeakReference<T> GC发现立即回收
虚引用 : PhantomReference<T> 始终返回null
WeakHashMap : 弱引用的 HashMap
3.5 改善性能
慎用异常,try catch浪费性能 (62ms/110ms)
使用局部变量,栈的访问比堆快 (78ms/266ms)
位运算代替乘除法 (31ms/219ms)
一维数组代替二维数组 (235ms/344ms)
提取公共表达式
降低循环次数 如数组赋值 i++ -> i+=3 (31ms/94ms)
布尔运算代替位运算 (逻辑运算中布尔运算快于位运算,越简单的越靠前)
使用System.arrayCopy()(native 函数)复制数组(31ms/250ms)
Buffer进行I/O操作
使用clone()代替new (一般是浅拷贝,其他需要具体实现clone)
静态方法代替实例方法
4. 并行程序开发及优化
&nb