![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
性能调优实战
高频性能问题
SugarPPig
半躺主义者
展开
-
使用 Java 多线程进行文件压缩
Java 多线程进行文件压缩原创 2023-01-31 20:13:10 · 1840 阅读 · 0 评论 -
【多线程性能调优】多线程调优(下):如何优化多线程上下文切换?
竞争锁优化:在多线程编程中,锁其实不是性能开销的根源,竞争锁才是。锁的优化归根结底就是减少竞争。a. 减少锁的持有时间:可以将一些与锁无关的代码移出同步代码块,尤其是那些开销较大的操作以及可能被阻塞的操作;b. 降低锁的粒度:同步锁可以保证对象的原子性,我们可以考虑将锁粒度拆分得更小一些,以此避免所有线程对一个锁资源的竞争过于激烈。如锁分离、锁分段;c. 非阻塞乐观锁替代竞争锁:CAS;wait/notify 优化:使用 Lock 锁结合 Condition 接口替代 Synchronized 内.原创 2022-03-08 08:24:47 · 303 阅读 · 0 评论 -
【多线程性能调优】多线程调优(上):哪些操作导致了上下文切换?
在并发程序中,并不是启动更多的线程就能让程序最大限度地并发执行。线程数量设置太小,会导致程序不能充分地利用系统资源;线程数量设置太大,又可能带来资源的过度竞争,导致上下文切换带来额外的系统开销。什么是上下文切换 时间片决定了一个线程可以连续占用处理器运行的时长。当一个线程的时间片用完了,或者因自身原因被迫暂停运行了,这个时候,另外一个线程(可以是同一个线程或者其它进程的线程)就会被操作系统选中,来占用处理器。这种一个线程被暂停剥夺使用权,另外一个线程被选中开始或者继续运行的过程就叫做上下文切换(C原创 2022-03-01 19:25:48 · 475 阅读 · 0 评论 -
【多线程性能调优】多线程之锁优化(下):使用乐观锁优化并行操作
什么是乐观锁 乐观锁在操作共享资源时,它总是抱着乐观的态度进行,它认为自己可以成功地完成操作。当多个线程同时操作一个共享资源时,只有一个线程会成功,失败的线程不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并且系统允许失败的线程重试,也允许自动放弃退出操作。 乐观锁相比悲观锁来说,不会带来死锁、饥饿等活性故障问题,线程间的相互影响也远远比悲观锁要小。更为重要的是,乐观锁没有因竞争造成的系统开销,所以在性能上也是更胜一筹。乐观锁的实现原理 CAS 是实现乐观锁的核心算法,它包含了 3 个参数:V原创 2022-02-27 22:14:08 · 442 阅读 · 0 评论 -
【多线程性能调优】多线程之锁优化(中):Lock同步锁的优化方法
Synchronized 同步锁需要 JVM 隐式获取和释放锁 ,Lock 同步锁(以下简称 Lock 锁)需要的是显示获取和释放锁。 Lock 锁的基本操作是通过乐观锁来实现的,但由于 Lock 锁也会在阻塞时被挂起,因此它依然属于悲观锁。 高负载、高并发的情况下,Synchronized 同步锁由于竞争激烈会升级到重量级锁,性能没有 Lock 锁稳定。Lock 锁的实现原理 Lock 锁是基于 Java 实现的锁,Lock 是一个接口类,常用的实现类有 ReentrantLock、R原创 2022-02-27 21:38:04 · 488 阅读 · 0 评论 -
【多线程性能调优】多线程之锁优化(上):Synchronized同步锁的优化方法
JVM 在 JDK1.6 中引入了分级锁机制来优化 Synchronized,当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;偏向锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。 减少锁竞争,是优化 Synchronized 同步锁的关键。我们应该尽量使 Sy原创 2022-02-20 20:57:17 · 355 阅读 · 0 评论 -
【Java编程性能调优】常用的性能测试工具
常用的性能测试工具开源免费: ab(ApacheBench)、JMeter付费:LoadRunnerab:简单易上手,在测试 Web 服务时非常实用;JMeter:功能性比较全,Windows 环境下有图形界面,不仅可以实现简单的并发性能测试,还可以实现复杂的宏基准测试。LoadRunner:在性能压测时,表现得非常稳定和高效。相比 JMeter,LoadRunner 可以模拟出不同的内网 IP 地址,通过分配不同的 IP 地址给测试的用户,模拟真实环境下的用户。...原创 2022-02-19 14:25:18 · 8037 阅读 · 0 评论 -
【Java编程性能调优】深入了解NIO的优化实现原理
Tomcat 中经常被提到的一个调优就是修改线程的 I/O 模型。Tomcat 8.5 版本之前,默认情况下使用的是 BIO 线程模型,如果在高负载、高并发的场景下,可以通过设置 NIO 线程模型,来提高系统的网络通信性能。 通过一个性能对比测试来看看在高负载或高并发的情况下,BIO 和 NIO 通信性能(这里用页面请求模拟多 I/O 读写操作的请求):测试结果:Tomcat 在 I/O 读写操作比较多的情况下,使用 NIO 线程模型有明显的优势。网络 I/O 模型优化 操作系统内核的网原创 2022-02-19 14:09:02 · 514 阅读 · 0 评论 -
【Java编程性能调优】如何优化RPC网络通信?
RPC 通信是大型服务框架的核心 微服务的核心是远程通信和服务治理。远程通信提供了服务之间通信的桥梁,服务治理则提供了服务的后勤保障。所以,我们在做技术选型时,更多要考虑的是这两个核心的需求。高并发场景下的技术选型 很多微服务框架中的服务通信是基于 RPC 通信实现的,在没有进行组件扩展的前提下,SpringCloud 是基于 Feign 组件实现的 RPC 通信(基于 Http+Json 序列化实现),Dubbo 是基于 SPI 扩展了很多 RPC 通信框架,包括 RMI、Dubbo、Hessi原创 2022-02-19 13:11:46 · 1101 阅读 · 0 评论 -
【Java编程性能调优】避免使用Java序列化
什么是 Java 序列化?Java 提供了一种序列化机制,这种机制能够将一个对象序列化为二进制形式(字节数组),用于写入磁盘或输出到网络,同时也能从网络或磁盘中读取字节数组,反序列化成对象,在程序中使用。Java 序列化的缺陷无法跨语言易被攻击序列化后的流太大序列化性能太差替换 Java 序列化目前业内优秀的序列化框架有很多,而且大部分都避免了 Java 默认序列化的一些缺陷。例如,最近几年比较流行的 FastJson、Kryo、Protobuf、Hessian 等。完全可以找一种替换掉原创 2022-02-18 19:40:05 · 235 阅读 · 0 评论 -
【Java编程性能调优】HashMap的设计与优化
HashMap 通过哈希表数据结构的形式来存储键值对,这种设计的好处就是查询键值对的效率高。 我们在使用 HashMap 时,可以结合自己的场景来设置初始容量和加载因子两个参数。当查询操作较为频繁时,我们可以适当地减少加载因子;如果对内存利用率要求比较高,我可以适当的增加加载因子。 我们还可以在预知存储数据量的情况下,提前设置初始容量(初始容量 = 预知数据量 / 加载因子)。这样做的好处是可以减少 resize() 操作,提高 HashMap 的效率。 HashMap 还使用了数组 + .原创 2022-02-18 08:27:55 · 630 阅读 · 0 评论 -
【Java编程性能调优】Stream如何提高遍历集合效率?
从大的设计方向上来说,Stream 将整个操作分解为了链式结构,不仅简化了遍历操作,还为实现并行计算打下了基础。 从小的分类方向上来说,Stream 将遍历元素的操作和对元素的计算分为中间操作和终结操作,而中间操作又根据元素之间状态有无干扰分为有状态和无状态操作,实现了链结构中的不同阶段。 在串行处理操作中,Stream 在执行每一步中间操作时,并不会做实际的数据操作处理,而是将这些中间操作串联起来,最终由终结操作触发,生成一个数据处理链表,通过 Java8 中的 Spliterator 迭..原创 2022-02-18 08:20:02 · 1355 阅读 · 0 评论 -
【Java编程性能调优】使用ArrayList还是LinkedList?
ArrayList 和 LinkedList 新增元素操作测试这里基于 ArrayList 初始化容量足够,排除动态扩容数组容量的情况下进行的测试,如果有动态扩容的情况,ArrayList 的效率也会降低。从集合头部位置新增元素从集合中间位置新增元素从集合尾部位置新增元素测试结果 (花费时间):ArrayList>LinkedListArrayList<LinkedListArrayList<LinkedList通过这组测试,我们可以知道 LinkedList 添原创 2022-02-18 08:02:25 · 598 阅读 · 0 评论 -
【Java编程性能调优】慎重使用正则表达式
正则表达式引擎实现正则表达式引擎的方式有两种:DFA 自动机(Deterministic Final Automata 确定有限状态自动机)和 NFA 自动机(Non deterministic Finite Automaton 非确定有限状态自动机)。在编程语言里,使用的正则表达式库都是基于 NFA 实现的。NFA 自动机的回溯用 NFA 自动机实现的比较复杂的正则表达式,在匹配过程中经常会引起回溯问题。大量的回溯会长时间地占用 CPU,从而带来系统性能开销。如何避免回溯问题?少用贪婪模式,多原创 2022-02-17 20:08:35 · 290 阅读 · 0 评论 -
【Java编程性能调优】String 字符串性能优化
构建字符串显示使用 StringBuilder 做字符串拼接;多线程编程中,使用 StringBuffer。存储字符串使用 String.intern 来节省内存空间,让变量字符串对象重复使用常量池中相同值的对象。 String a = new String("abc"); String b = new String("abc"); if (a != b) { System.out.println("a!=b");原创 2022-02-17 19:54:14 · 329 阅读 · 0 评论 -
【性能调优基础】性能调优策略
原创 2022-02-17 19:22:00 · 205 阅读 · 0 评论 -
【性能调优基础】性能调优标准
什么时候开始介入调优?系统编码完成后、项目成功上线后哪些计算机资源会成为系统的性能瓶颈?CPU、内存、磁盘 I/O、网络、异常、数据库、锁竞争有哪些指标可以作为性能调优的标准?响应时间、吞吐量、计算机资源分配使用率、负载承受能力...原创 2022-02-17 19:18:30 · 317 阅读 · 0 评论