jvm性能调优(五)-----深入了解性能优化

影响一个系统性能的方方面面

常用的性能评价/测试指标 

响应时间

提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。

如:数据库查询花费的时间,将字符回显到终端上花费的时间,访问 Web 页面花费的时间;

并发数 

指同一时刻,对服务器有实际交互的请求数。和网站在线用户数的关联。

吞吐量

对单位时间内完成的工作量(请求)的量度。

如:每分钟的数据库事务,每秒传送的文件千字节数,每分钟的 Web 服务器命中数

关系

通常,平均响应时间越短,系统吞吐量越大;平均响应时间越长,系统吞吐量越小。但是,系统吞吐量越大, 未必平均响应时间越短。

常用的性能优化手段

前端优化 

A、浏览器/App

1、减少请求数;

a、合并css、合并js、合并图片等

b、http头中的keep-alive(现在浏览器都是默认开启,基本不需要操心)

2、使用客户端缓冲;

静态资源文件缓存在浏览器,通过Cache-Control和Expires

3、启用压缩

服务器端对资源进行压缩,客户端进行解压缩(但是会给服务器以及浏览器增加压力)

4、资源文件加载顺序

css放在页面最上面,js放在最下面

5、减少Cookie传输

静态页面不传输cookie信息

B、CDN加速

内容分发网络(图片、css、js等静态资源)

C、反向代理缓存

比如使用nginx,将静态资源放在nginx上面。

D、WEB组件分离

应用服务性能优化

A、缓存

优先考虑使用缓存优化性能,缓存离用户越近越好。适用于读写比高的数据,也就是读多写少的场景,如果每秒数据都被更改,缓存就失去了意义,不仅数据时效性差,缓存的维护也浪费了资源。

1、缓存的基本原理、本质以及问题

频繁修改的数据,尽量不要缓存,读写比2:1以上;
缓存一定是热点数据;
应用就要容忍一定时间的数据不一致;
缓存可用性问题;
缓存预热;
缓存击穿:1、布隆过滤器;2、把不存在的数据也缓存起来({"key":null})

2、分布式缓存与一致性哈希

如果node4这个服务器挂了,那么数据会放到node3上。

B、集群

C、异步

1、同步、异步、阻塞、非阻塞

同步和异步关注的是结果消息的通信机制;
阻塞和非阻塞关注的是等待结果返回给调用方的状态。

2、解释

同步、异步:

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞、非阻塞:
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。
3、常见异步的手段
a、Servlet异步
b、多线程
c、消息队列

D、程序

1、代码级别

a、选择合适的数据结构

b、选择更优的算法

c、编写更少的代码

2、并发编程

a、充分利用CPU多核,尽量使用线程池,合理设置线程数量,尽量使用JDK 提供的各种并发框架和工具

b、实现线程安全的类,避免线程安全问题

c、同步下减少锁的竞争

  • 缩小锁的范围,减少锁的粒度,锁分段,
  • 替换独占锁,读写锁,CAS代替锁,ThreadLocal等等

3、资源的复用

减少开销很大的系统资源的创建和销毁

a、单例模式

b、池化技术

4、JVM

a、与JIT编译器相关的优化

  • 热点编译的概念
  • 选择编译器类型 -server,-client,-XX:+TieredCompilation
  • 代码缓存相关 –XX:ReservedCodeCacheSize=N
  • 编译阈值
  • 编译线程
  • 方法内联
  • 逃逸分析

b、GC调优

  • 目的
  • 调优的原则和步骤
  • 学会阅读GC日志
  • 其他与GC相关的参数
  • 推荐策略

c、调优实战

  • 不同的内存大小
  • 不同的GC回收器

存储性能优化

尽量使用SSD

定时清理数据或者按数据的性质分开存放

结果集处理

原文地址:https://www.cnblogs.com/alimayun/p/12352959.html