认识java性能

看懂程序的性能

对于客户端程序而言,拙劣的性能会严重影响用户体验。界面停顿、抖动、响应迟钝等会遭到用户的抱怨,一个典型例子就是Eclipse IDE工具在Full GC时,会出现程序假死现象,相信一定被不少开发人员所诟病,对于服务器程序来说,性能问题则更为重要,相信不少后台服务器软件都有各自的性能目标。以WEB为例,服务器的响应时间,吞吐量就是两个重要的参数,当服务器承受巨大的访问压力时,可能出现响应时间边长、吞吐量下降,甚至是抛出内存溢出异常而崩溃。

一般来说程序性能通过一下几个方面来表现
执行速度:程序的反应是否迅速,响应的时间是否够短。
内存分配:内存分配是否合理,是否过多的消耗内存或者内存泄漏。
启动时间:程序从运行到可以正常处理业务需要花费多长时间。
负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓。

性能的参考指标:
执行时间:一段代码从开始到运行结束,所用的时间
CPU时间:函数或者线程占用CPU的时间
内存分配:程序在运行时占用的内存空间
磁盘吞吐量:描述I/O的使用情况。
网络的吞吐量:描述网络的使用情况。
响应时间:系统对某用户行为或者事件作出响应的时间,时间越短,性能越好。

木桶原理
将这个理论应用到系统性能优化上,可以这么理解,即使系统拥有充足的内存资源和CPU资源,但如果磁盘IO性能低下,那么系统的总体性能是取决于当前最慢的磁盘IO速度,而不是当前最优的CPU或者内存,这时候只有提高磁盘IO性能,系统的整体性能才能进行优化。
木桶原理,真实的说明了系统的最终性能取决于表现最差的性能组件。

最可能称为系统瓶颈的计算资源如下:
磁盘IO:由于磁盘IO读写的速度要比内存慢的多,程序在运行过程中,如果需要等待磁盘IO完成,那么低效的IO操作会拖累整个系统。
网络操作:对网络数据进行读写的情况与磁盘IO类似,由于网络环境的不确定性,尤其是对互联网上数据的读写,网络操作的速度可能比本地磁盘IO更慢。因此,如不加特殊处理。也极有可能称为系统瓶颈。
CPU:对计算机资源要求较高的应用,由于其长时间、不间断的大量占用CPU资源,那么对CPU争夺将导致性能问题。如科学计算,3D渲染等。
异常:对java来说,异常的捕获和处理是非常消耗资源的 ,如果程序高频率的进行异常处理,则整体性能便会有明显下降。
数据库:大部分应用程序都离不开数据库,而海量数据的读写操作可能是相当费时的,而应用程序可能需要等待数据库操作完成或者返回请求结果集,那么,缓慢的同步操作将成为系统瓶颈。
锁竞争:对于高并发程序来说,如果存在激烈的锁竞争,无疑是对性能极大的打击,锁竞争将会明显增加线程上下文切换的开销。而且这些开销都是与应用程序无关的系统开销,白白占用宝贵的系统资源。
内存:一般来说,只要应用程序设计合理,内存在读写速度上不太可能成为性能瓶颈,除非应用程序进行了高频率的内存交换和扫描,但这些情况比较少见,使内存制约系统性能最可能的情况是内存大小不足。与磁盘相比,内存的大小似乎小的可怜,这意味着应用软件只能尽可能的将常用的核心数据读入内存,这在一定程度上降低了系统性能。

Amdahl定律

Amdahl定律

根据Amdahl定律,使用多核CPU对系统进行优化,优化效果取决于CPU的数量以及系统中的串行化程序CPU数量越多,串行化比重越低,则优化效果越好,仅提高CPU数量而降低程序的串行化比重,也无法提高程序性能。

性能调优的层次

为了提升系统的性能开发人员可以从系统的各个角度和层次对系统进行优化。除了最常见的代码优化之外。在软件架构上、JVM虚拟机层、数据库以及操作系统层面都可以通过各种手段进行调优。从而在整体上提升系统性能。
设计调优:
设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行。在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在问题,并给出合理的设计方案,由于软件设计和系统架构对软件整体质量有决定性影响。所以设计调优对系统的性能也是最大的。如果说,代码优化、JVM优化都是对系统微观层面上量的优化,那么设计优化就是对系统在宏观层面上质的优化。
设计优化的一大显著特点,它可以规避某一组件的性能问题,而非改良该组件的实现,,比如,系统中的组件A需要等待某事件E才能出发行为,如果组件A出现循环监控,不断检测E事件是否发生,其检测行为必然会占用部分系统资源,因此开发人员必须开发人员必须在检测频率和资源消耗之间取得平衡。如果检测频率太低,虽然减少了资源消耗,但是系统的实时反应性就会降低。而如果将此问题预留在设计层解决,便可以使用事件通知的方式将系统进行倒置,如使用观察者模式,在事件E发生的时刻,由事件E通知组件A,从而触发组件A的行为。这种方法弃用了存在性能隐患的循环监控。设计调优直接决定了系统整体品质,如果从设计上不进行详细周密的考虑,也无法通过代码优化进行弥补。
进行设计调优时,涉及人员必须熟悉常用的软件设计方法、设计模式、基本性能组件和常用优化思想,并将其有机地继承在软件系统中,
代码调优:
代码调优设计诸多编码技巧,需要开发人员熟悉相关的语言的API,并在合适的场景中正确使用相关API或类库,同时,对算法、数据结构的灵活使用,也是代码优化的重要内容。
虽然代码优化是微观上对性能进行调优,但是一个好的实现和一个坏的实现对系统的影响也是非常大的。比如同样作为List的实现,LinkList和ArrayList在随机访问的性能却可以相差几个数量级,又比如文件读取的实现,使用Stream的方式和java NIO的方式,其性能可能又会相差一个数量级。
JVM调优:
JVM的各项参数将会直接影响java程序运行。比如JVM堆的大小,垃圾回收策略等。要对JVM进行调优,需要对JVM运行原理和基本内存结构有一定了解。如堆内存结构、GC的种类等。
数据路调优:
1.在应用层对SQL语句优化
2.对数据库进行优化
3.对数据库软件进行优化。
操作系统调优:
操作系统的性能对应用系统也有较大的影响。

19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值