把 Java 性能调优分成 5 个层级:Java 编程、多线程、JVM 性能检测、设计模式、数据库性能,每个层级下都覆盖了最常见的优化问题。下面分别给你梳理一下:
可参考地址:Java性能调优全攻略来了_着火点的博客-CSDN博客_java性能调优
第 1 层:Java 编程性能调优
JDK 是 Java 语言的基础库,熟悉 JDK 中各个包中的工具类,可以帮助你编写出高性能代码。课程从基础的数据类型讲起,涉及容器在实际应用场景中的调优,还有现在互联网系统架构中比较重要的网络通信调优。
(1)、字符串性能优化
第一: 字符串拼接
String:适用于少量的字符串操作的情况;
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况;没有加同步锁,所以线程不安全
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况;方法加了同步锁(synchronized) ,所以是线程安全的
在实现代码中 String 类被 final 关键字
修饰了, String 对象的不可变性,即 String 对象一旦创建成功,就不能再对它进行改变,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,执行速度很慢
StringBuilder和StringBuffer没有“final”修饰符,所以两种对象都是可变的。这里没有频繁的创建和回收,所以速度会很快。
第二:在字符串拼接使用+号时,会被编译器优化成StringBuffer的方式,但是如果循环里面做+号等于每次循环生成一个新的StringBuiler实例,同样也会减低系统性能。
String str= "ab" + "cd" + "ef"; 编译器自动优化了这行代码String str= "abcdef";
(2)、正则表达式优化
第一:使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置
第二:使用正确的量词(+、*、?、{n,m}),如果能够限定长度,匹配最佳
(3)、I/O优化
1、使用缓冲区优化读写流操作
2、使用 DirectBuffer 减少内存复制
3、避免阻塞,优化 I/O 操作
(4)、序列化优化
序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。
即将对象转化为二进制,用于保存,或者网络传输。
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
与序列化相反,将二进制转化成对象
为啥要优化:
在一些包含比较大的对象比如有上百个对象的列表序列化、反序列化的逻辑中,有一个序列化+反序列化操作,他们加起来时间占据了接近1/3,由此可见为了达到高TPS,序列化的性能和大小也是不可忽视的
第一:kryo、jackson都作为json序列化工具,可以考虑kryo序列化方式,其性能比jackson高出不少,同时没有pb/flatbuffer一样的额外结构维护要求
Kryo是一个快速且高效的针对Java对象序列化的框架
- 序列化的性能非常高
- 序列化结果体积较小
- 提供了简单易用的API
可参考地址:序列化 — Kryo序列化 - 怀瑾握瑜XI - 博客园
深入浅出序列化(2)——Kryo序列化 - 知乎
(5)、
第 2 层:多线程性能调优
目前大部分服务器都是多核处理器,多线程编程的应用广泛。为了保证线程的安全性,通常会用到同步锁,这会为系统埋下很多隐患;除此之外,还有多线程高并发带来的性能问题,这些都会在这个层级重点讲解。
乐观锁优化并发策略(CAS、读写锁、并发锁信号量)
线程池优化(合理地设置线程池大小,避免创建过多线程)
多线程调优:wait/notify 的使用导致了较多的上下文切换
第 3 层:JVM 性能监测及调优
Java 应用程序是运行在 JVM 之上的,对 JVM 进行调优可以提升系统性能。这个层级重点讲解 Java 对象的创建和回收、内存分配等。
第 4 层:设计模式调优
在架构设计中,我们经常会用到一些设计模式来优化架构设计。这里刘超会结合一些复杂的应用场景,分享设计优化案例。
单列模式
亨元模式(针对对象重复使用)
装饰模式
第 5 层:数据库性能调优
数据库最容易成为整个系统的性能瓶颈,这里刘超会重点解析一些数据库的常用调优方法。