没有合适的资源?快使用搜索试试~ 我知道了~
JAVA性能调优
5星 · 超过95%的资源 需积分: 0 35 下载量 52 浏览量
2013-05-01
14:19:13
上传
评论
收藏 700KB DOC 举报
温馨提示
试读
32页
java性能调优,从识别性能瓶颈到针对瓶颈进行对应的调优。主要是编程习惯。
资源详情
资源评论
资源推荐
前言:
是面向对象思想的杰出代表,通过接口、继承、多态等技术为系统提
供了强大的复用行、扩展性以及兼容性。作为市场占有率最高的平台, 还
对各种语言、技术进行了强有力的支持,这种海纳百川的特质在让我们受益无
穷的同时也使得整个 框架更加的庞大、复杂甚至是臃肿。
在日常的研发工作中,我们通常只需要使用 的一部分功能,特别在一
些核心业务中,比如 、、,更是需要剥离一些不必要的系统消耗来提
高整个框架的性能,这次分享将会解释一些 底层的实现原理,并介绍利用
这些原理,做一些额外的工作来提高系统性能的方法策略
一、 调优调什么、怎么调
首先,让我们看看让系统变慢的因素,主要集中在下面几点
1、 业务本身比较复杂,因此处理比较复杂
2、 频繁制造对象,创建和释放对象消耗了系统资源
3、 内存使用过高,造成频繁的系统
4、 程序算法不够高效
5、 外部因素,如网络延迟等
以上几点,对于处在应用层的 来说,影响最大的无非是 点, 和
具有技术层面不可控性,也不在 调优范围之内因此 调优是在明确
了需求的大前提下 ,比如并发数、响应时间、吞吐量等等,监控我们的业务系
统运行情况, 、内存的占用率以及网络使用情况等,发现系统瓶颈——内
存瓶颈、 负载过大、网络阻塞等,适当引入一些技术和方法,或降低内存
使用(延迟加载)、或减少 消耗(对象池)、或减少网络传输( 多元
化、批处理以及缓存减少传输次数从而减少 校验等),来协调各个资源,
从而满足性能需求的活动。
二、 系统监控工具
自带了一些帮助开发人员监控 运行状况的工具,通过在启动
服务时指定一些选项,可以启动这些自带的工具,获得有用的信息,通常我们
可以把这些选项加进 的 里面,从而查看应用的信息,例如在行:
!" #$%#% &'(!)**( &'(+)**( &
'',"(-."$/
后面加入&"0!"12 选项,0!! 会把每次 的信息输出到控制台,如下图:
2.1 使用-Xloggc 选项监控 GC 情况
2.1.1 使用方法
直接打印到控制台的信息通常统计起来非常不方便,因此用&'30112 选项将
信 息 输 出 到 指 定 的 文 件 是 个 不 错 的 注 意 , 可 以 直 接 用 &'30112 替 换 &
"0!"12 , 例 如 : !" #$%#% &'(!)**( &
'(+)**( &'',"(-."$/ &'',+"(-."$/ &'30112,,4
"! 501 + /,其中” ,4 "! 501 + /6是输出文件的位置,可随意命名,输
出的内容格式如下:
7//,8/))&9:;)*/::*<***:7!"2!=
7):,8>33:&9/;)*/::*<**/):!"2!=
/*:,8/&9//7;)*/::*<****//7!"2!=
:*:7,8//&977;)*/::*<**))!"2!=
*7,8/7)*&9*;)*/::*<**!"2!=
),8/::/&9*;)*/::*<**7!"2!=
*,8>33*&9*7/;)*/::*<*)7*!"2!=
7:,8:*)&9/7*;)*/::*<***)/!"2!=
//,8://):&9/*7;)*/::*<**7)/!"2!=
7,87:&9));/::)/<**))!"2!=
*/),8):)&97**;/7*/<**:/:*!"2!=
其中标识的有 的代表对新生代内存区域的 ,标识有 >55 的信息代
表对整个内存堆的 ,其他信息,以
7//,8/))&9:;)*/::*<***:7!"2!=
为例 7// 代表当前被收集的对象数量,/)) 代表 前对象占用的空间
大小,: 代表 后对象占用的空间大小,)*/::* 代表可使用的空间
大小,***:7 代表本次 消耗的时间
2.1.2 如何计算 GC 消耗
过高的 消耗会使系统变慢,同时暗示过多的创建和释放对象,需要进行
优化。计算方法比较简单,可以扫描和分析文件,将所有 条目消耗的时间
除以应用运行的总时间即可,
公式为: 时间和?系统运行时间
假设上例运行了 分钟即 * 秒, 时间和为 **) 秒,则 占用
比率为 **)?*,约等于 ***,等于 *%,因此 消耗占
了 *%。
注意:系统在运行时间内并不是 **%的占用 ,偶尔也会有其他程序抢占
,可以通过一些操作系统工具来统计占用比例,假设实际上在 分钟内只
占用了 *%的 时间,则上例的 消耗为:**)?;*@*%<,
约等于 %,因此 消耗实际占了 %
2.1.3 GC 性能指标
参考一些 性能调优网站上的指标, 时间在低于 %的时候很理想,
%&%为可接受,超过 %则被认为 过于频繁,对象数量过多。
2.1.4 总结与分享
&'30112 提供了监控内存使用情况的信息,让我们知道是否创建了过多的对
象,当对象过多,造成可使用内存渐渐变小,形成频繁 时,我们可以考虑
在程序中更快的释放对象,需要时再创建,虽然这会增加 的负载(创建和
释放很消耗资源),但是可以解决内存瓶颈,而从很大程度上来说,调优就是
一个协调资源的过程。
2.2 使用-Xrunhprof 监控 CPU
同&'30112 相似&'AB0C 也提供了对系统的监控,他提供的工具每隔一
定间隔(默认 * 毫秒,可自定义)就对 栈区进行取样,获得正在执行的
方法的信息,包括执行时间、方法调用树等,并且根据占用情况排序,让我们
了解最消耗 的方法和代码,从而找到瓶颈代码,进行优化
2.2.1 使用方法
将 &'AB0C 选 项 加 入 命 令 中 , 例 如 : !" #$
%#% &'(!)**( &'(+)**( &'',"(-."$/ &
'',+"(-."$/ &'AB0C,D3"$,4
"! >501 + 2B$!(B3"!(0- 0$E A"F$EF"B A$/,红字部分是
加入的选项及其参数,其中“D3"$,4 "! >501 + 6指定监控报告输出的文件,
“2B$!(B3"!6代表对 进行取样,我们可以看见在统计报告里面看见
消耗方法的排名,“(0- 0$E6指定输出的统计报告里面包括每个对象的
锁的等待和使用情况,用于多线程监控。“F"B A$/6表示跟踪的方法调用树的
深度。输出的格式内容如下:
第一部分:样本统计
5GG; 0 3$/<"*:,,)*
H!"3C22(20 2"(" A0F
:/%:/%):)**/)" 3-02H" (B3!02H" 22"B
:%/%):**)*7" 3-02H" (B3!02H" 22"B
:%/%):***)" 3-02H" (B3!02H" 22"B
:*7%%)/**)/" 3-02H" (B3!02H" 22"B
:*%*:%)**:*)" 3-02H" (B3!02H" 22"B
/:*%:/%)**:*" 3-02H" (B3!02H" 22"B
):**%//%)**::" 3-02H" (B3!02H" 22"B
::**%//%)**:)" 3-02H" (B3!02H" 22"B
以上是 取样列表,其中
H:代表占用级别,占用高的排前面
!"3C:方法占用 时间的具体比率
22(:从前面的方法累加到此方法共占用的 时间
20 :取样时发现方法正在执行的次数
2":跟踪号,工具取到了每个方法调用的方法树,并赋予了一个 -F,就是
跟踪号,通过这个可以查阅到方法的调用方法,以及调用方法的调用方法,
层次取决于 F"B A 参数
(" A0F:执行的方法的完整名称
第二部分:方法树跟踪
IG****,; A"F$****<
" I53!!50F"DF3!!;I53!!50F",::<
!(-!252A"JG+ 3!!50F"DF3!!;52A",7<
313!!50F"30F3!!;3!!50F",*)<
313!!50F"30F3!!;3!!50F",**<
!(-!252A"JBB3!!50F"30F3!!;52A",*<
313!!50F"30F3!!;3!!50F",<
IG****,; A"F$****<
!(-!2I53!! A1" 50F";I53!! A,*<
!(-!2I53!! A1" 50F";I53!! A,7)<
!(-!2I53!! A1" I"!02";I53!! A,/)<
" I53!!50F"J;I53!!50F",7<
!"2- E22"!!0 033"F0--3"1"F;22"!!0 033",H0K
3-"<
" I53!!50F"DF3!!;I53!!50F",::<
LLLLLLLL
LLLLLLLL
这部分包含了每个方法的调用路径
2.2.2 总结与分享
这个报告列出了最占用 的方法的列表,并且可以找到方法的调用树,通
常我们需要优先对排在最前面的方法进行调优,那样每增加一点性能,对整个
系统的性能提升都很大,对一个只占用 % 时间的方法调优,就算优化
**%的性能,最终也只能提升系统性能的 %
一般排在前面的方法都是来自 包的方法,因为 已经进行了严格
的封装,所以我们要重写或者扩展比较困难,在这种情况下,可以对方法的调
用方法进行调优,使其在调用上优化,从而达到对被调用方法的优化,以此类
推,可以对调用方法的调用方法进行优化。
三、 对象创建
对内存的监控和对 的监控结果告诉我们是否存在瓶颈——内存瓶颈或
瓶颈。我们可以通过管理对象的创建来控制对象在内存中的数量从而控制
内存占用以及 在创建和释放对象时的消耗。
综上所述,在不考虑解决瓶颈的情况下,可以执行几点来达到在内存中高效
使用内存的目的。
、 在频繁调用的程序((" A0F)里面不要创建对象,因为频繁调用会
频繁的创建和释放对象,这是个非常大的消耗,可以把对象当作参数
传入程序,这样可以复用对象。
、 在使用集合的时候,尽可能将集合申明成需要的容量,集合对象在重
新分配空间的时候需要创建一个新的更大容量的集合,然后将集合的
内容全部拷贝到新集合里面,像 M!AB 这种集合还需要重新计算
每个对象的 A!A 值,从而定位元素在新 中的位置
、 "、 ">0( 这种对象应该尽量申明成静态的,在自主抛
异常中断的代码中,如果不需要跟踪 G'G 的栈信息,则
G'G 对象也应该申明成静态的
3.1 复用对象
在释放对象之前,考虑是否可以通过重设对象的属性,在下次继续使用。当
然复用会占用一些内存,如果内存是主要的瓶颈,即使可以复用也可以考虑不
复用,减少内存消耗。
3.1.1 对象池
与 连接池类似,使用工厂方法对对象进行缓存,需要的时候分配一个对
象,使用结束由工厂收回。
3.1.2 复用参数
考虑作为参数传入方法的对象是否可以作为结果输出,如果可以,尽可能的
对参数进行复用,避免创建新的对象。有一种极端的情况,在安全级别极高的
代码里,不仅不能复用参数,还要执行保护性拷贝,创建一个新的对象,把参
数对象的属性赋予新对象,接下来的代码中全部使用新对象,这样可以避免重
剩余31页未读,继续阅读
shenziping
- 粉丝: 3
- 资源: 54
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3