文档章节

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

 叶荷
发布于 2017/08/29 19:23
字数 1931
阅读 6
收藏 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
私信 提问
加载中
请先登录后再评论。
学习自动化测试须知

转载自本人公众号:自动化测试 在我写关于自动化测试的文章之前,以及读者在决定学习自动化测试之前,需要了解以下内容,并真正做好学习自动化测试的准备。 什么是自动化测试? 自动化测试是...

AllenLife
2018/05/29
0
0
Java程序员必读的经典书籍

身为Java程序员的你可能正在思考平时应该看一些什么书籍来提高自己的能力,那么今天我就给大家推荐一些我曾经看过的经典书籍。 1.《Java从入门到精通(第3版)》 这本书从Java初学者角度出发...

濡沫
2018/08/10
38
0
fbf的书单,欢迎分享,欢迎更新

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

fbf
2015/03/16
190
0
【有奖书评】JAVA 7来袭,还看 Java 你就OUT了

从1995年至今,Java已经超过15个年头,经过这些年的演进,Java已不仅是个程序语言,也代表了解决问题的平台(Platform),更代表了原厂、各个厂商、社群、开发者与用户沟通的成果。若仅以程序语...

louise
2012/08/31
1.3W
121
看了三个月这几个公众号,终于拿到了阿里巴巴offer

专注于编程、互联网动态。最终将总结的技术、心得、经验(数据结构与算法、源码分析等)分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经。 本文分享自微信公众号 - 看那个码...

潘永斌
2019/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在JavaScript中从字符串中删除所有非数字字符 - Strip all non-numeric characters from string in JavaScript

问题: Consider a non-DOM scenario where you'd want to remove all non-numeric characters from a string using JavaScript/ECMAScript. 考虑一个非DOM场景,您希望使用JavaScript / EC......

法国红酒甜
52分钟前
14
0
Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
今天
4
0
如何在Django视图中合并两个或多个查询集? - How to combine two or more querysets in a Django view?

问题: I am trying to build the search for a Django site I am building, and in that search, I am searching in 3 different models. 我正在尝试搜索要构建的Django网站,在该搜索中,我......

javail
今天
5
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0
OSChina 周三乱弹 —— 公主是大王的,命是自己的。小怪也要养家糊口啊!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :郭燕的单曲《下半生》 最近听一些轻快的歌 #今日歌曲推荐# 《下半生》 - 郭燕 手机党少年们想听歌,请使劲儿戳(这里) @锦年 :...

小小编辑
今天
38
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部