性能优化我觉得应该分两步走,第一步:寻找性能瓶颈,第二步:性能调优;
下面分别进行分析:
第一步:寻找性能瓶颈
通常性能瓶颈的表象是资源消耗过多、外部处理系统的性能不足;或者资源消耗不多,但是程序效应还是很慢;
资源主要消耗在cpu,文件io,网络io以及内存方面,当某一资源消耗过多会造成系统响应慢;
外部处理系统的性能不足主要是所调用其他系统提供的功能或数据库的响应速度不够,外部系统慢可能也是资源消耗过多导致,数据库响应慢可以对数据库进行调优;
资源消耗不多但仍然慢主要原因是程序代码运行效率不高,未充分使用资源或程序结构不合理;
1.1cpu消耗分析
可以通过相关命令比如top,pidstat,找出各个类型消耗cpu的占比,最常见的就是us和sy类型分别代表用户进程消耗和线程间切换消耗;如果us过高可以找到相关的线程ID然后分析代码;如果sy过高是不是启动了过多的线程导致线程切换过多;
1.2文件io消耗
要跟踪线程的文件IO消耗,可以通过pidstat来查找,可以查到每秒的读写kb数;找到读写kb数多个线程,然后结合jstack找到相关的java代码,然后分析;
1.3网络io消耗
可以通过sar来分析网络的消耗状况,但是不能具体到每个线程所消耗的网络IO,只能对线程dump,查找产生了大量网络io的线程;
1.4内存消耗
结合top或pidstat,以及jvm的内存分析工具来分析内存消耗;要区分是jvm外的物理内存还是jvmheap区内存;如果是jvm外的物理内存要分析程序中DirectByteBuffer,如果是jvmheap可以通过jvisualvm来分析;
1.5资源消耗不多但仍然慢
主要原因是:锁竞争激烈,未充分使用硬件资源,数据量增长
第二步:性能调优
2.1jvm调优
主要包括各个代的大小、GC策略等;代大小的设置:避免新生代大小设置过小,或者过大;避免Survivor区过小或过大;合理设置新生代存活周期;GC策略根据吞吐量优先还是延迟优先进行设置策略;
2.2程序调优
1.CPU消耗严重解决
us过高主要是执行线程无任何挂起动作,可以进行Thread.sleep *** 作;sy过高主要是因为创建了过多的线程导致线程上下文切换;
2.文件IO消耗严重解决
造成文件IO消耗严重的原因主要是多个线程写大量的数据到同一个文件,导致文件很快变的很大,从而写入速度越来越慢,并造成各线程激烈竞争争抢文件锁,常用的调优方法:异步写文件,批量读写,限流,限制文件大小;
3.网络IO消耗严重解决
主要原因是同时发送或者接受的包太多,解决办法就是限流;
4.内存消耗严重解决
解决:释放不必要的引用,使用对象缓存池,采用合理的缓存失效策略,合理使用softReference和WeakReference;
2.3资源消耗不多但仍然慢
主要原因是:锁竞争激烈,未充分使用硬件资源
大多数JAVA开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识。好吧,不能说这是完全错误的。
优化应用程序以获得最佳性能不是一件容易的事情。但是,这并不意味着如果你不具备这些知识,就不能做任何事情。这里有一些易于遵循的调优方式,南邵java培训建议可以做个参考!
大部分建议是针对Java的。但也有若干建议是与语言无关的,可以应用于所有应用程序和编程语言。在讨论专门针对Java的性能调优技巧之前,让我们先来看看通用技巧。
1.在你知道必要之前不要优化
这可能是最重要的性能调整技巧之一。你应该遵循常见的最佳实践做法并尝试高效地实现用例。但是,这并不意味着在你证明必要之前,你应该更换任何标准库或构建复杂的优化。
在大多数情况下,过早优化不但会占用大量时间,而且会使代码变得难以阅读和维护。更糟糕的是,这些优化通常不会带来任何好处,因为你花费大量时间来优化的是应用程序的非关键部分。
那么,你如何证明你需要优化一些东西呢?
首先,你需要定义应用程序代码的速度得多快,例如,为所有API调用指定最大响应时间,或者指定在特定时间范围内要导入的记录数量。在完成这些之后,你就可以测量应用程序的哪些部分太慢需要改进。然后,接着看第二个技巧。
2.使用分析器查找真正的瓶颈
在你遵循第一个建议并确定了应用程序的某些部分需要改进后,那么从哪里开始呢?
你可以用两种方法来解决问题:
·查看你的代码,并从看起来可疑或者你觉得可能会产生问题的部分开始。
·或者使用分析器并获取有关代码每个部分的行为和性能的详细信息。
希望不需要我解释为什么应该始终遵循第二种方法的原因。
很明显,基于分析器的方法可以让你更好地理解代码的性能影响,并使你能够专注于最关键的部分。如果你曾使用过分析器,那么你一定记得曾经你是多么惊讶于一下就找到了代码的哪些部分产生了性能问题。老实说,我第一次的猜测不止一次地导致我走错了方向。
3.为整个应用程序创建性能测试套件
这是另一个通用技巧,可以帮助你避免在将性能改进部署到生产后经常会发生的许多意外问题。你应该总是定义一个测试整个应用程序的性能测试套件,并在性能改进之前和之后运行它。
这些额外的测试运行将帮助你识别更改的功能和性能副作用,并确保不会导致弊大于利的更新。如果你工作于被应用程序若干不同部分使用的组件,如数据库或缓存,那么这一点就尤其重要。
对于很多学习开发的人员来说,进行性能优化是一个非常复杂的问题,并且还需要大量的经验和知识积累。想要优化达到一定的效果是一件非常不容易的事情,很多人认为需要在经验非常丰富的情况下才能使用,其实在没有获得丰富经验和知识之前也是可能进行性能优化的,天通苑电脑培训认为只要掌握一定的方法和技巧就能创建出性能良好的程序。
在进行性能调优的过程中,主要是基于Java语言,但是也有一些是可以使用在应用程序和编程语言中。那么在使用之前,天通苑IT培训为大家一起讨论通用的性能调优技巧。
1、先不要急着优化
在必要之前,一定不要急着进行优化,这是一种非常重要的性能调优方法。在进行调优过程中,我们应该遵守最佳的实践方法,这样才能得到有效的实现。但是在使用过程中并不意味着需要证明必要性,最好的方法是使用标准库或是构建复杂进行优化。
在很多情况下,如果过早的进行优化会占用很大一部分的时间,还会出现代码不好读取和维护的情况。如果更严重,这样的优化是不会带来任何好处的,很多时候你花费大量时间进行优化的程序并非是最关键的地方。
2、使用分析器找到瓶颈
在确定应用程序的某些部分需要优化的时候,应从哪里进行入手呢?解决这种情况主要有两种方法,天通苑IT培训认为首先就是了解代码,找出看上去存在问题和可能产生疑惑的地方开始优化。其次是可以使用分析器进行优化,分析器能够获取代码中每个部分的性能详细信息。
3、为应用程序创建测试套件
这个一种能够帮助你避免很多问题的方法,很多问题主要是发生在性能部署在生产环境之后。在使用过程中,你可以定义测试整个应用程序的套件,这样就能完成性能改造和运行。在测试运行的过程中,能够帮助你更改功能和性能的影响,这样才能让利大于弊。如果在使用过程中,你的任务运行于多个应用程序的多个部分,例如数据库、缓存等,这是非常重要的。
进行Java性能调优的技巧有很多种,在进行性能调优的过程中可以选择适合自己的方法,在提高应用程序的性能中,不需要做大量的工作。天通苑电脑培训认为最好的方法就是进行稍微努力,这样就能很好的应用到代码中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)