一 基本知识
.~8w
}ejP WS0
`z{7rN/p-j%Pk0 1.1 性能是什么
:K0U8G7e*r7D Y$}051Testing软件测试网(ThRWMY
在性能调优之前,我们首先来了解一下性能是什么?
51Testing软件测试网srHC9vKFn\*{%I
1) 运算的性能——看哪一个算法的执行性能最好?
51Testing软件测试网0KOok]}3p'h{
2) 内存的分配——程序运行时需要耗费多少内存?
:U)iA qp7it;j0
$b4[!e'qM0o-t2u#SV0 3) 启动的时间——程序启动需要多长时间?
51Testing软件测试网$b!p1L,X%w Jh.}
f.R
4) 程序的可伸缩性——在压力负载的情况下,程序的性能如何?
sfn2ak0
!e!o;D"d&yR0 5) 性能的感知——用户在什么情况下会觉得程序的性能不好?51Testing软件测试网.un6p^;Y`U9}o
51Testing软件测试网1XA:N4V:i*ERF
以上五个方面,在具体的使用场景可以有选择的去评判。
1.2 调优的规则51Testing软件测试网w"PpZ]/[j8lC
51Testing软件测试网z`6c6Q)Xf
C8X:S
我们只需要关心对程序有影响,可以察觉到的性能问题,而不是每一个类中的每
一个方法我们都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要
求,我们才需要考虑如何优化性能。同样的,晦涩的代码虽然提高了程序的性能,但
是很难维护,这个开发人员离职了下个接手的估计够呛除非技术很牛或者代码注释写
得很好。所以我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运
行的足够快,达到客户所期望的性能要求。---其实这点很难做到。51Testing软件测试网-H/eM|B@Mq3I
51Testing软件测试网0ua7h(c9q1Q
优化代码甚至会导致不良的结果,在开始性能调优前,需要先指出不优化代码的
一些理由。
51Testing软件测试网7fAP.I4|%B3He4r(y{/g51Testing软件测试网N.n
v4Z)Q Fn~!{$M 1) 如果优化的代码已经正常
工作,优化后可能会引入新的bug,所以优化后功
能测试很重要特别是优化基类的东西;51Testing软件测试网"`
QwA!Q4D8l8cf
51Testing软件测试网 `d1R@}3Yk3Z
2) 优化代码趋向于使代码更难理解和维护因此注释很重要,要做良好的代码注
释习惯。51Testing软件测试网&P
IP0c.|}s
*\SMf!]Eti0 3)对于跨平台的,在一个平台上优化的代码,在另一个平台上可能更糟;51Testing软件测试网GcMZujs\
"C5T
X2b `
{Y0 4) 花费很多时间在代码的优化上,提高了很少的性能,却导致了晦涩的代码。
确实,在优化前,我们必须认真的考虑是否值得去优化。51Testing软件测试网
\-A8_#[ at+f%n
51Testing软件测试网-dv~;p:XV
1.3 调优的步骤
a"\,D%XW
O0
XwX&f3c'hM ~{f0 一般我们提高应用程序的性能划分为以下几个步骤:51Testing软件测试网K
sC8K'x PJl7r
U4q?#L3zk%_5h0 1) 明确应用程序的性能指标,怎样才符合期望的性能需求;
kTZ ]~U051Testing软件测试网'^C;ZqNgP
2) 在目标平台进行测试;
5aY |p3nG$? s0
"M_*~8HC#cA{0 3) 如果性能已经达到性能指标就不用优化了;
8wQ!A,JER[6k051Testing软件测试网|8d@Jv/?I$]}G
4) 查找性能瓶颈;
0`x$abpg
VSR051Testing软件测试网-KPG@Dh
v U
5) 修改性能瓶颈;
6eSX#?d'F*xJ051Testing软件测试网$@Q
]~~3yE
6) 返回到第2步。
*h]1_2mA051Testing软件测试网5J NMO~7T2|D'B
二 JDK调优51Testing软件测试网 N.c6G|8ya s_
51Testing软件测试网#^'EsYb+yL
2.1 选择合适的JDK版本51Testing软件测试网iamg|&]&E
51Testing软件测试网1\)b;S~5qO_f
不同版本的JDK,甚至不同厂家的JDK可能都存在着很大的差异,对于性能优化
的程度不同。
Q6{;qh8D._O%Q0 2.2 垃圾收集Java堆的优化
l/jj'Hb\Ew#r ]0
!B.r/lOY3Y3u5IP0 垃圾收集就是自动释放不再被程序所使用的对象的过程。当一个对象不再被程序
所引用时,它所引用的堆空间可以被回收,以便被后续的新对象所使用。垃圾收集器
必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。
如果对象不再被使用,但还有被程序所引用,这时是不能被垃圾收集器所回收的,此
时就是所谓的“内存泄漏”。监控应用程序是否发生了内存泄漏,有一个非常优秀的
监控工具推荐给大家——Quest公司的JProbe工具,使用它来观察程序运行期的内存
变化,并可产生内存快照,从而分析并定位内存泄漏的确切位置,可以精确定位到源码内。