问题1:性能优化的指标
响应时间
提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。
如:数据库查询花费的时间,将字符回显到终端上花费的时间,访问Web页面花费的时间;
并发数 指同一时刻,对服务器有实际交互的请求数。和网站在线用户数的关联。 吞吐量 对单位时间内完成的工作量(请求)的量度。 如:每分钟的数据库事务,每秒传送的文件千字节数,每分钟的Web服务器命中数

问题2:性能优化的方法

1.前端优化
(1)浏览器/APP
**减少请求数:**合并css,Js,图片
使用客户端缓冲:静态资源文件缓存在浏览器中,Cache-Control(相对时间)和Expires
启用压缩:减少CSS文件大小,增加文件传输速度,但会给浏览器和服务器带来压力。
资源文件加载顺序:css放在页面最上面,js放在最下面
减少Cookie传输:比如静态资源可以不用
(2)CDN加速
内容分发网络。
(3)反向代理缓存
比如Nginx接到请求后分发到后端的Web应用上,但是把静态资源放到Nginx上,不返回后端。
(4)WEB组件分离

2.应用服务优化
(1)缓存
缓存的数据:频繁修改的数据,不适合缓存,读写比较大的适合缓存,缓存一定是热点数据,遵循28定律
缺点:使用缓存,应用就要容忍一定时间的数据不一致
缓存可用性问题:应该做好缓存的分布式,避免缓存雪崩,造成数据服务器宕机
缓存预热:事先把热点数据加载好。
缓存击穿:持续高并发的请求一个不存在的数据,1.布隆过滤器,2.把不存在的数据也缓存起来
解决缓存中的数据倾斜:一致性哈希

(2)异步
同步与异步:关注的是结果消息的通信机制
阻塞和非阻塞:关注的是等待结果返回给调用方的状态
bio 同步阻塞
nio 同步非阻塞
aio 异步

(3)集群

(4)程序级别
1.代码优化
选择合适的数据结构
选择更优的算法:最大自列和问题
编写更少的代码
2.并发编程
充分利用CPU多核,尽量使用线程池,合理设置线程数量,尽量使用JDK提供的各种并发框架和工具
实现线程安全的类,避免线程安全问题
同步下减少锁的竞争:
- 缩小锁的范围,减少锁的粒度,锁分段,
- 替换独占锁,读写锁,CAS代替锁,ThreadLocal
3.资源的复用
减少开销很大的系统资源的创建和销毁
单例模式
池化技术
4.JIT编译器相关的优化
热点编译的概念
选择编译器类型:-server(适用于热点代码的编译),-client(适用于快速启动为目标的程序)
-XX:+TieredCompilation(分层编译,可结合-server使用)
代码缓存相关: -XX:ReservedCodeCacheSize=N
编译阈值:执行到了某个次数(在一定时间段内),就进行热点编译,方法调用计数器,循环回边计数器
编译线程:编译热点代码的线程
方法内联:
方法字节码小于325字节+方法够热才会内联 XX:MaxFreqlnlineSize=N.
方法小于35个字节,一定会内联-Xx:MaxInlineSize
逃逸分析
5.GC调优
目标:GC时间小,次数少
步骤:
1、监控GC的状态;
2、分析结果,判断是否要优化
minor GC执行时间50ms以下,10S一次、FullGC执行时间1s以下,频率10分钟以上,则不太需要调
3.进行调参:
第一位:选择合适的GC回收器
第二位:选择合适的堆大小
第三位:选择年轻代在堆中的比重
3.存储性能优化
尽量使用SSD
定时清理数据或者按数据的性质分开存放
结果集处理
4.优化的原则:
1.切忌过早过度优化
2.网站性能优化优先考虑使用缓存优化性能,缓存离用户越近越好