一、设计模式
1、单例模式:
对于频繁使用的对象,可以省略创建对象所花费的时间,减少内存使用频率,减轻GC压力。
单例模式相比静态类的优势:可以继承、被继承、实现接口,面向对象风格;静态类不行,是面向过程风格的。
2、代理模式:
因为安全原因,屏蔽客户端直接访问真实对象;远程调用,隐藏远程调用的细节;提升性能,实现延迟加载 (如 Hibernate )。
实现方式:JDK动态代理、CGLIB等
3、享元模式:
节省重复创建对象的开销;对系统内存要求少,GC压力小。
4、装饰者模式:
既继承又委托。动态添加对象功能。如加缓冲优化IO:FileOutputStream -> BufferedOutputStream
5、观察者模式:
UI上的Onclick 事件,JMS 的onMessage 事件等。
二、优化组件和方法
1、缓冲 Buffer:
如IO中的BufferWriter,BufferReader 等
2、缓存 Cache:
EHCache、OSCache等
3、对象复用池:
数据库连接池 C3P0 、DBCP 等
4、负载均衡:
Apache + Tomcat 集群,Session 可以复制 (但是容易造成网络繁忙)。
Terracotta + Tomcat 集群,实现Session共享,效率高。
5、事件换空间:
不引入多余变量,实现数字 a、b 交互
a = a+b; (此时1为和sum)
b= a-b; (sum- 旧b =旧a)
a= a-b; (sum- 新B = sum - 旧A = 旧B =新A )
6、空间换时间
比如缓存。
三、字符串优化
1、字符串分割
StringTockenizer 比直接的split() 方法好
2、StringBuffer 、StringBuilder
StringBuffer 同步 、StringBuilder 非同步。
在初始化时候指定容量,如 new StringBuilder (20);
四、核心数据结构优化
1、List
ArrayList 基于数组、LinkedList 基于链表
2、Map
HashMap:基于hash算法
LinkedHashMap:有序的HashMap,按照插入顺序排序
TreeMap:继承自SortedMap,基于红黑树(一种平衡二叉树),可以自定义排序规则 (元素继承Coparable)
3、Set: Set 是Map 的一种封装,其内部实现跟Map相同
HashSet:基于hash算法
LinkedHashSet: 有序的HashSet,按照插入顺序排序
TreeSet: 继承自SortedSet,基于红黑树(一种平衡二叉树),可以自定义排序规则 (元素继承Coparable)
4、NIO
DirectBuffer 可以直接访问系统物理内存,不需要在JVM的堆上分配空间,铜过设置 -XX:MaxDirectMemorySize=100M 设置
5、引用类型
强引用:
软引用:
弱引用:例子,WeakHashMap,可以作为缓存
虚引用:
6、其他编码技巧
慎用异常
成员变量转化为局部变量
位移运算代替乘除法
使用arrayCopy
五、并行程序设计模式
1、Future 模式
Future 用于实现Callable 接口的class中
FutureTask 既实现 Callable 又实现 Runnable
2、 Master-Worker 模式
3、Guarded Suspension 模式
4、不变模式
5、生产者-消费者模式
六、JDK多任务框架
1、简单线程池实现
2、Executor 框架
3、自定义线程池、扩展ThreadPoolExecutor
七、JDK 并发集合
1、CopyOnWriteArrayList、CopyOnWriteArraySet
2、ConcurrentHashMap
3、ConcurrentLinkedQueue
4、LinkedBlockingQueu 用于生产者-消费者模式
5、LinkedBlockingDeque
八、并发控制方法
1、volatile
2、synchronized
3、Lock、ReadWriteLock
4、Condition
5、Semaphore
6、ThreadLocal
九、锁的优化
1、避免死锁
2、减小锁持有时间
3、减小锁粒度
4、读写锁分离来替换独占锁
5、锁分离
十、JVM 调优
1、
2、
3、