文档章节

身为JAVA工作者必须了解的实战知识(十)

 叶荷
发布于 2017/08/29 19:23
字数 1931
阅读 2
收藏 0

造成开销的操作包括:

1. 线程之间的协调(例如:锁、触发信号以及内存同步等)

2. 增加的上下文切换

3. 线程的创建和销毁

4. 线程的调度

一、对性能的思考

1 性能与可伸缩性

运行速度涉及以下两个指标:

某个指定的任务单元需要“多快”才能处理完成、计算资源一定的情况下,能完成“多少”工作。

可伸缩性:

当增加计算资源时(例如:CPU、内存、存储容器或I/O带宽),程序的吞吐量或者处理能力能相应地增加。

2 评估各种性能权衡因素

避免不成熟的优化。首先使程序正确,然后再提高运行速度---如果它还运行得不够快。

以测试为基准,不要猜测。

提出问题:例如“更快”的含义是什么?提升多少效率?

二、并发三大定律

Amdahl 定律

Gene Amdahl 发现在计算机体系架构设计过程中,某个部件的优化对整个架构的优化和改善是有上限的。这个发现后来成为知名的 Amdahl 定律。

(即使你有10个老婆,也不能一个月把孩子生下来。)

Gustafson 定律

Gustafson假设随着处理器个数的增加,并行与串行的计算总量也是可以增加的。Gustafson定律认为加速系数几乎跟处理器个数成正比,如果现实情况符合Gustafson定律的假设前提的话,那么软件的性能将可以随着处理个数的增加而增加。

(当你有10个老婆,就会要生更多的孩子。)

Sun-Ni 定律

充分利用存储空间等计算资源,尽量增大问题规模以产生更好/更精确的解。

(你要设法让每个老婆都在干活,别让她们闲着。 )

1 示例:在各种框架中隐藏的串行部分

2 Amdahl定律的应用

多线程中串行部分是性能提升的瓶颈,例如:

多线程在同一个队列中取出任务,因为需要保证线程安全肯定在队列上加锁,此时就是多线程中串行部分。

多线程通常是处理一些计算,而计算结果可能需要多个线程间进行共享,这也是多线程中串行部分。

三、线程引入的开销

1 上下文切换

大多数通用的处理器中,上下文切换的开销相当于5000~10000个时钟周期(几微妙)

UNIX系统的vmstat、mpstat命令和Windows系统的perfmon工具都能报告上下文切换次数以及和内核中执行时间所占比例等信息。

2 内存同步

在 synchronized 和 volatile 提供的可见性保证中可能会使用一些特殊指令,即内存栅栏(Memory Barrier)。

publicStringgetStoogeNames(){

Vector stooges =newVector();

stooges.add("Moe");

stooges.add("Larry");

stooges.add("Curly");

returnstooges.toString();

}

在执行getStoogeNames中,至少将Vector上的锁获取/释放4此,3次add操作与1次toString操作。

JVM会把在一起操作进行合并,可能仅需要获取1次add锁与1次toString锁。

3 阻塞

四、减少锁的竞争

在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁。

有3中方式可以降低锁的竞争程度:

1. 减少锁的持有时间。

2. 降低锁的请求频率。

3. 使用带有协调机制的独占锁,这些机制允许更高的并发性。

1 缩小锁的范围(“快进快出”)

如果一个方法中,仅有一个变量是需要多线程间共享的,不需要在方法上添加synchronized,因为这样会直接锁住整个方法导致其多线程间穿行执行,可以通过方法中仅锁住对共享变量操作的部分来缩小锁的范围提高性能。

2 减小锁的粒度(锁分解)

在一个分装中,如果分别提供的多个方法是分别对多个数据源操作,最严谨的方式是在所有方法上都把当前类作为锁定条件,但是可以通过在每个数据源上添加一个独立的锁。

3 锁分段

上一个中是一个类中涉及到多个数据源,如果仅有一个数据源(例如:Map)如何提高性能?

在数据源上添加分段锁,例如把map的个数除以4,4份中每一份是用一个单独的锁来锁定。

4 避免热点域

前面提到的通常是针对一个变量、一个数据集合、多个数据集合提高性能的办法,但是有些情况下一个方法内涉及到多个变量或者同一个变量的多个操作,可以通过减少这种情况出现的次数提升性能。

5 一些替代独占锁的方法

通过放弃独占锁来提升性能。如并发容器,ReadWriteLock,不可变对象以及原子变量。

6 监测CPU的利用率

CPU没有得到充分利用的原因:

. 负载不充足

. I/O密集

. 外部限制

. 锁竞争

7 向对象池说“不”

对象分配操作的开销比同步的开销更低。

五、示例:比较Map的性能

六、减少上下文切换的开销

以上就是我推荐给Java开发者们的一面试经典知识。但是这些知识里面并没有太多Java全栈、Java晋阶、JAVA架构之类的题,不是我不推荐,而是希望大家更多的从基本功做起,打好基础,太多复杂的内容一会儿也说不明白。

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 24
码字总数 41519
作品 0
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
0
0
Python爱好者要明确的未来方向

了解Python是什么? Python 这门语言它是面向对象编程语言,有封装强大的类库,Python目前已经超过了Java成为人们最喜欢的编程语言。相比Java,Python更加的容易理解、免费开源的代码、Pytho...

糖宝lsh
09/20
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
07/25
0
0
Java培训实战教程之Java基础知识精华部分(一)(二)(三)

Java培训实战教程之Java基础知识精华部分(一)_java概述 =============================================================================Java培训实战教程之Java基础知识精华部分(一)_java概...

黑泽明军
04/13
0
0
Java怎么学?2018最新Java学习路线,技术要求与项目推荐详解!

关注小编吧!! 回顾2017年,java发展的程度超乎了我们的想象,对技术的要求也越来越高,从原先的前端,后端的分布,到现在企业要求的全栈,对于个人能力的要求是逐步提高的,那我们现在究竟...

qq_41781067
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
7
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
18
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部