简介
当一个软件系统完成基本功能上线运行后,如前期设计不佳,后面很容易出现内存和性能问题。解决这些问题有多种途径,其中最为常用的方式:借助监控工具,直接找到问题点(或某个范围),然后仔细研究代码,找出根因并整改。本文仅对性能类问题做深入探讨
当程序出现性能问题后,最直接的表现是:系统请求响应变慢、CPU持续居高不下,常见可能导致性能问题的操作:
1)频繁的I/O操作(比如:网络,本地文件读写);
2)频繁的申请较大内存,导致系统频繁Full GC;
3)由于程序自身bug,导致系统进入死循环或其它耗时逻辑中;
4)不当的锁保护(力度过大),导致响应线程等待;
5)其它...
有些性能问题,只有系统上到一定的压力下,才表现出来。为避免,就要求我们在日常的编码中要勤思考
Java性能问题分析工具概述
- HPROF
Java自带的分析工具,通过实现Java Virtual Machine Tool Interface(JVM TI),监控虚拟机类加载、方法调用等事件,对其做数据收集,从而统计出性能数据。
参考:http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html
- VisualVM
JDK自带的分析工具,JDK_1.6.23之后的版本才带着个工具,监控一段时间后,收集快照,可以找到耗时点
- jProfiler
一款商业工具,需要付费,但其功能非常强大,不仅可以分析性能问题,还可以分析诸如:内存泄露、线程同步等问题,该工具使用比较广
参考:http://www.ej-technologies.com/products/jprofiler/overview.html
- YourKit
类似jProfiler,需要付费,其功能没有jProfiler强大,但运行速度更流畅些,具体没使用过
参考:http://www.yourkit.com/overview/index.jsp
监控方式
- 1)日志:
通过System.currentTimeMillis(),在待检测逻辑前后分别获取系统时间戳,做差值计算后,输出至控制台或文件;
其最大缺点是要该代码,对业务逻辑浸入大;
- 2)事件:
采用 JVMTI(JVM Tools Interface)API 来捕捉诸如方法调用、类载入、类卸载、进入/离开线程等事件,然后基于这些事件进行程序行为的分析,JVMTI需要使用C/C++编写实现代码
- 3)抽样(sampling):
每隔一段时间中断系统,收集当前的调用栈信息,基于这些信息得到函数的调用关系图及每个函数的 CPU 使用信息;
缺点是:分析不是非常精确的,但几乎不影响目标程序的运行速度。
- 4)字节码注入 (BCI)
在运行期,动态在目标程序中添加profiler逻辑片段,实时收集方法、内存等信息;
缺点是:影响程序运行速度,但其统计的耗时百分比是比较准确的
PerfMonitorTool详细介绍
本工具是基于方式4)字节码注入 (BCI)+javaagent技术实现,如下图所示:
- Java agent:
主要作用是向JVM虚拟机中注册一个代理,从而可以监控类加载
- ASM:
是一种动态修改Java字节码技术,纯Java实现,通过其提供的方法,可以在加载类过程中,完成对待监控类方法对应字节码的修改
[延伸]:bTrace也可以实现,其功能更强大
- 前期准备
1)安装Bytecode Outline插件:
在Eclipse中:"Help->EclipseMarketplace...”,查找“Bytecode Outline”,点击安装;
完成安装后,我们就可以打开该视图,从而可以查看java到ASM字节码之间的映射关系:
2)使用agent的类注意点:
需要在其jar包对应MANIFEST.MF文件中添加如下属性项:Premain-Class: com.ucweb.profile.Main,其中Main类中有如下签名方法
public static void premain(String args, Instrumentation inst)
agent包依赖ASM库,在其jar包对应MANIFEST.MF文件中添加如下属性项:
Class-Path: asm-all-3.3.1.jar
最终对应的MANIFEST.MF文件内容大致如下:
- 源码路径:
https://hg.ucweb.local/repos/users/yuyj/perf_monitor 请参考工程目录下ReadMe.txt
- 部署运行,请参考:
部署_Java应用程序性能监控工具
参考资料
http://www.ibm.com/developerworks/cn/java/j-lo-profiling/?ca=drs- 常用Java Profiling 工具的分析
http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html SUN官方hprof工具介绍
http://www.ibm.com/developerworks/cn/java/j-lo-jpda2/ JVMTI介绍
http://www.importnew.com/1486.html 深入了解JVM虚拟机
http://asm.ow2.org/index.html ASM介绍
http://jiprof.sourceforge.net/ Java Interactive Profiler