Q:当有人说程序运行的很慢的时候,他指的是什么?
A:他通常所指的是两个性能属性中的一个 -- 延迟/扩展性。延迟是描述完成给定任务所需的时间长短,然而扩展性描述的是当负载增加时对性能是如何影响的。构建高性能的应用程序需要
1.低延迟 -- 比如,很短的页面加载时间
2.高扩展性 -- 比如,在用户量增加的同事不会对性能带来不利的影响
3.高可用性 -- 比如,保证24 * 7的可用,不会因为内存泄露、数据库连接耗尽或者LDAP服务器而服务不可用
如上图所示,很多原因都会对性能有所影响。它包括一个设计糟糕的程序、数据库、不能很好扩展的负载不良的架构设计,虚拟机、应用服务器、或者一个性能差劲的sql语句,多个线程同时等待长时间运行的加锁方法、代码块或者数据库记录带来的频繁回溯跟踪产生的线程争用问题。因为对系统稀有资源进行操作消耗的更多的CPU周期带来的过度的垃圾回收或者内存与连接的耗尽等这些内存或者非内存的泄露也都会让性能大打折扣。
Q.应该使用什么工具来对程序进行调优?
A.针对java程序的调试,有一些基本工具比如vmstat、hrof、JConsole、JAMon以及PerfAnal,也有一些有更多特性的打包调优工具例如VisualVM、NetBeans profiler、eclipse TPTP(也就是测试和性能工具平台),还有能被用在生产环境中的比如YourKit for Java、JProfiler for Java,还有针对于大规模分布式和集群系统的比如CA Wiley Introscope for Java、HP Sitescope and ClearStone for Java。
Q.应该怎么样去进行java程序的调优?
A.下面的例子是用hprof工具来估算java程序运行耗费的cpu时间。根据依赖的底层操作系统不同,在win32上使用Ctrl + \或者Ctrl + Break组合键或者在程序退出的时候将调试信息导出到java.hprof.txt文件中。在Solaris系统或者linux系统上此文件是通过接收退出信号生成的(kill -QUIT)。可以通过jps命令查询到线程id。使用hprof agent执行Profiling Test类来计算耗费的cpu时间的命令格式如下:
java -agentlib:hprof=cpu=times test.ProfilingTest
调试信息会被转储到名字为“java.hprof.txt”的文件中。
CPU TIME (ms) BEGIN (total = 1953) Thu Sep 15 12:26:50 2011 rank self accum count trace method 1 51.20% 51.20% 1 301025 ProfilingTest.invokeMethod3 2 31.23% 82.44% 1 301015 ProfilingTest.invokeMethod2 3 15.21% 97.64% 1 301005 ProfilingTest.invokeMethod1 4 0.82% 98.46% 1 300396 java.net.URLClassLoader$1.run 5 0.77% 99.23% 2 300707 java.io.Win32FileSystem.normalize 6 0.77% 100.00% 268 300309 java.lang.StringBuilder.append CPU TIME (ms) END
使用PerfAnal图形化分析工具分析上面的信息
也可以用相似的方式来分析内存占用信息.