文档章节

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

 叶荷
发布于 2017/08/29 19:23
字数 1931
阅读 2
收藏 0
点赞 0
评论 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
Java怎么学?2018最新Java学习路线,技术要求与项目推荐详解!

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

qq_41781067 ⋅ 05/23 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Java开发|Java新手应该怎么学习|2018年Java走势|

微信跳一跳你玩过吗,你知道怎么用Java开发出来吗?有时间可以研究一下!言归正传! 在2017回,java,发展程度超出我们的想象,对技术的要求也越来越高,从最初的前端、后端的布局,目前整个堆...

糖宝_d864 ⋅ 06/08 ⋅ 0

少走弯路,给Java 1~5 年程序员的建议

今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。 在大家看之前,LZ要先声...

重走Java ⋅ 05/29 ⋅ 0

学会这几点,你会成为一名月薪过万的Java程序员

每一个稍微有点出息的人,都应该把行业里的前三名作为自己奋斗的目标和对手。你离成为冠军Java程序员还有多远,看完这篇你就知道了。 软件工程师的职业生涯里,知识有一个三年的半衰期。这意...

梦想远方_8e96 ⋅ 06/12 ⋅ 0

Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!

前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装完居然是 ...

Java技术栈 ⋅ 04/27 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

Java程序员编程学习—Java新手职业生涯规划分享

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/17 ⋅ 0

Java开发学习之三版本简介 java编程

  Java编程语言,在更迭迅速的互联网领域多年屹立不倒,足以得见Java这门语言旺盛的生命力,因此,会有很多想要进入互联网领域的朋友,想要学Java来转行开发。但是,所谓“隔行如隔山”,j...

老男孩Linux培训 ⋅ 06/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一张图看懂CDN全站加速产品解决方案

原文链接 本文为云栖社区原创内容,未经允许不得转载。

阿里云云栖社区 ⋅ 17分钟前 ⋅ 0

一张图看懂CDN全站加速产品解决方案

原文链接

猫耳m ⋅ 17分钟前 ⋅ 0

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 35分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 40分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 42分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 45分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 51分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 54分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 54分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 57分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部