Java并发编程实战 - 第11章 性能与可伸缩性
2017-04-27 08:19
465 查看
线程最主要的目的是提高程序的运行性能。但线程也会引入额外的开销,如线程之间的协调,上下文切换,线程的创建和销毁,线程的调度。
性能有很多指标,如运行速度,吞吐量,可伸缩性等。
可伸缩性指增加计算资源时(如CPU,内存,I/O带宽,存储容量等),程序的吞吐量或处理能力能相应的增加。
Amdahl定律
可伸缩性取决于所在代码中必须串行执行的代码比例。
线程引入的开销
上下文切换
保存当前线程的上下文,并将新调度进来的线程上下文设置为当前上下文。
内存同步
同步操作,synchronized 和volatile提供的可见性保证中可能使用内存栅栏指令刷新内存。
非竞争的锁,JVM通过优化去掉锁操作。
阻塞
大多数JVM在等待锁时只是将线程挂起,这个过程包括额外的上下文切换。
如何提升可伸缩性?
减少锁的竞争能够提高性能和伸缩性。
锁上发生的竞争有两个因素:锁的请求频率和每次的持有该锁的时间
缩小锁的范围,缩短锁的持有时间。
减小锁的粒度,降低锁的请求频率。
可以通过锁分解和锁分段等技术实现,如ConcurrentHashmap。
放弃独占锁
使用并发容器,读写锁,不可变对象以及原子变量。
监测CPU的利用率
Unix 和 Windows都有监测CPU的工具。
Unix 监测CPU的工具 vmstat 和mpstat;
Unix I/O监测工具 iostat;
WIndows CPU和I/O监测工具 perfmon。
不用对象池
多线程对对象池中的对象的访问开销很大
减少上下文切换的开销
性能有很多指标,如运行速度,吞吐量,可伸缩性等。
可伸缩性指增加计算资源时(如CPU,内存,I/O带宽,存储容量等),程序的吞吐量或处理能力能相应的增加。
Amdahl定律
可伸缩性取决于所在代码中必须串行执行的代码比例。
线程引入的开销
上下文切换
保存当前线程的上下文,并将新调度进来的线程上下文设置为当前上下文。
内存同步
同步操作,synchronized 和volatile提供的可见性保证中可能使用内存栅栏指令刷新内存。
非竞争的锁,JVM通过优化去掉锁操作。
阻塞
大多数JVM在等待锁时只是将线程挂起,这个过程包括额外的上下文切换。
如何提升可伸缩性?
减少锁的竞争能够提高性能和伸缩性。
锁上发生的竞争有两个因素:锁的请求频率和每次的持有该锁的时间
缩小锁的范围,缩短锁的持有时间。
减小锁的粒度,降低锁的请求频率。
可以通过锁分解和锁分段等技术实现,如ConcurrentHashmap。
放弃独占锁
使用并发容器,读写锁,不可变对象以及原子变量。
监测CPU的利用率
Unix 和 Windows都有监测CPU的工具。
Unix 监测CPU的工具 vmstat 和mpstat;
Unix I/O监测工具 iostat;
WIndows CPU和I/O监测工具 perfmon。
不用对象池
多线程对对象池中的对象的访问开销很大
减少上下文切换的开销
相关文章推荐
- 并发编程实战学习笔记(八)——性能与可伸缩性
- 探索并发编程(六)------Java多线程性能优化
- Java 并发编程实战学习笔记——CountDownLatch的使用
- java 并发编程实战第三章同步辅助类CyclicBarrier解析
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
- 【Java并发编程实战】-----synchronized
- 学习java并发编程实战的一些心得体会(一)
- Java 并发编程实战学习笔记
- java并发编程实战手册第三章同步辅助类Phaser
- java并发编程实战手册第二章笔记
- 【Java并发编程实战】—–“J.U.C”:锁,lock
- Java 并发编程实战学习笔记——串行任务转并行任务
- Java并发编程实战--
- 【java并发编程实战】-----线程基本概念
- java并发编程实践-性能和可伸缩性
- Java 并发编程实战学习笔记——路径查找类型并行任务的终止
- java 并发编程实战 第一天
- java 并发编程实战 第二天
- 【Java并发编程实战】—–synchronized
- 【Java并发编程实战】-----线程基本概念