共计 1664 个字符,预计需要花费 5 分钟才能阅读完成。
性能调优的档次
- 设计调优
- 代码调优
- JVM 调优
- 数据库调优
- 操作系统调优
设计调优
善用设计模式
单例模式
单例模式是一种对象的创立模式,用于产生一个对象的具体实例,它能够确保零碎中一个类只产生一个实例。益处;
1> 对于频繁应用的对象,能够省略创建对象所破费的工夫,这对于那些重量级对象而言,是十分可观的一笔零碎开销
2> 确保一个类只有一个对象,每次调用都是同一个对象,缩小 new 的操作次数,升高对系统的内存的应用频率,加重 GC 压力,缩短 GC 进展工夫
代理模式
将耗费资源最多的办法都应用代理模式拆散,就能够放慢零碎的启动速度,缩小用户的等待时间。
外围其实就是应用提早加载,只有当用到了以后的组件时,才会去初始化他。这样如果有些组件没有被用到,就不必加载,防止资源的节约
享元模式
如果一个零碎中存在多个雷同的对象,那么只需共享一份对象拷贝,而不用为每次应用都创立新的对象,益处:
1> 被享元模式保护的雷同对象每次只会被创立一次,当创立的对象比拟耗时时,便能够节俭大量工夫
2> 创建对象缩小,内存的需要也会缩小,使得 GC 的压力也响应升高
利用:String 类对象,Java 中将 String 类定义为 final(不可扭转的),JVM 中字符串个别保留在字符串常量池中,java 会确保一个字符串在常量池中只有一个拷贝,这个字符串常量池在 JDK6.0 以前是位于常量池中,位于永恒代,而在 JDK7.0 中,JVM 将其从永恒代拿进去搁置于堆中
观察者模式
当一个对象的行为依赖于另外一个对象的状态时,观察者模式就相当有用,如果不应用观察者模式,则只能在另一个线程中不停的监听对象所依赖的状态。可能须要开很多线程来实现这个性能
罕用优化组件和办法
1、缓冲
缓冲区能够是一块特定的区域,次要是为了解决应用程序上上层之间的性能差别,进步零碎的性能。应用场景特点:
1> 数据通信不须要太实时,异步通信
利用:音讯队列 MQ,起到削峰填谷的性能。日志零碎 silfj,数据太大就先写入队列,缓缓写入日志服务器
2、缓存
作用:开拓一块内存空间寄存数据处理后果,供下次访问应用。
利用:Redis 等缓存软件性能
3、对象复用(池化)
如果一个类被频繁申请应用,那么不用每次都生成一个实例,能够将这个类的一些实例保留在一个池中,待须要应用时从池中获取,用完了再放回池中。
利用:线程池和数据库的连接池都是应用了该办法
4、并行代替串行
联合 CPU 的多核并行能力,开启多线程施展 CPU 的最大潜能
5、负载平衡
利用:分布式集群
Java 程序优化
有助于晋升性能的技巧
1、慎用异样
try-catch 实现:每个类 class 文件会追随一张异样表,每一个 try-catch 都会在这个表里增加行记录,每一个记录都有 4 个信息(try catch 的开始行(begin_pc),完结行(begin_pc),异样的解决起始行(handler_pc,catch 代码块),异样类型 catch_type)
1> 代码产生异样时,就会去异样表中找抛出异样的行是否在 begin_pc 和 begin_end 之间,如果是的话,并且是 catch_type 类型,则跳转到 handler_pc 的地位去执行。进行办法的出栈、入栈操作,回溯出整个链路的栈信息
2> 如果代码不产生异样,则不会去表中查找,基本上不会有性能耗费
倡议:须要 try-catch 的中央还是须要持续用。防止在 for 循环中应用
2、应用局部变量
调用办法时传参以及在调用中创立的长期变量都保留在栈(Stack)中,速度较快。其余变量,动态变量,实例变量等,都在堆(Heap)中创立,速度较慢
3、位运算代替乘除法
所有运算中,位运算是最高效的
a*=2 ==> a<<=1
a/=2 ==> a>>=1
4、尽可能的提取表达式,防止多余的计算
x = d a b / 3 4 a;
y = e a b / 3 4 a;
能够优化为
t = a b / 3 4 * a;
x = d * t;
y = e * t;
5、静态方法代替实例办法
java 中实例办法须要保护一张相似虚函数表的构造,以实现对多态的反对。与静态方法相比,实例办法的调用须要更多的资源(比方如果它继承了父类的话,实例化对象时可能须要执行父类的构造方法)