木桶原理(短板理论)
一个木桶盛水多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁最短的那块。
性能调优的层次
- 设计调优
- 代码调优
- JVM调优
JVM堆大小、垃圾回收策略等。 - 数据调优
- 在应用层对SQL语句进行优化;
- 对数据库进行优化;
- 对数据库软件进行优化。
- 操作系统调优
基本调优策略和手段
系统性能调优的最主要目的就是查找并解决性能瓶颈问题
。
- 有明确的性能目标,清楚地指出优化的对象和最终目的;
- 在目标平台上对软件进行测试,确认是否达到目标;
- 如果尚未达到性能目标,则需要找到性能瓶颈;
- 改进优化,消除瓶颈。
设计优化
善用设计模式
参考:面试题汇总(设计模式)
- 单例模式
- 代理模式
将代理模式用于实现延迟加载,可以有效提升系统的启动速度,对改善用户体验有很大的帮助。 - 享元模式
如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象。
享元模式的主要作用是复用大对象
。
享元模式和对象池的区别?
在一个对象池中,所有的对象都是等价的,任意两个对象在任何使用场景中都可以被对象池中的其他对象替代。
而在享元模式中,享元工厂所维护的所有对象都是不同的,任何两个对象间不能相互替代。
常用优化组件和方法
缓冲(buffer)
缓冲可以协调上层组件和下层组件的性能差
。当上层组件性能优于下层组件时,可以有效减少上层组件对下层组件的等待时间
。
缓冲区不宜过小,过小的缓冲区无法起到真正的缓存作用。
缓冲区也不宜过大,过大的缓冲区会浪费系统内存,增加GC负担。
缓存(cache)
缓存的主要作用是暂存数据处理结果,并提供下次访问使用
。
使用动态代理
无需修改一个逻辑方法的代码,便可以为它加上缓存功能,提高性能。
对象复用——“池”技术
核心思想:如果一个类被频繁请求使用,那么不必每次都生成一个实例,可以将这个类的一些实例保存在一个“池”中,待需要的时候直接从池中获取
。
应用场景:线程池和数据库连接池。
只有对重量级对象使用对象池技术才能提高系统性能,对轻量级的对象使用对象池,可能反而会降低系统性能。
并行替代串行
多线程技术
负载均衡
时间换空间
空间换时间
典型应用:缓存
Java程序优化
StringBuffer和StringBuilder的区别
StringBuffer支持并发操作,线性安全的,适合多线程中使用
StringBuilder不支持并发操作,线性不安全的,但其在单线程中的性能比StringBuffer高
字符串拼接效率:StringBuilder > StringBuffer > String
网友评论