Java应用程序性能监控工具

原创 2015年02月28日 17:06:58

简介

当一个软件系统完成基本功能上线运行后,如前期设计不佳,后面很容易出现内存和性能问题。解决这些问题有多种途径,其中最为常用的方式:借助监控工具,直接找到问题点(或某个范围),然后仔细研究代码,找出根因并整改。本文仅对性能类问题做深入探讨

当程序出现性能问题后,最直接的表现是:系统请求响应变慢、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之后的版本才带着个工具,监控一段时间后,收集快照,可以找到耗时点 


参考:http://visualvm.java.net

  • 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

构建自己的监测器【2】-javaagent参数使用

javaAgent  javaAgent是从JDK1.5及以后引入的,在1.5之前无法使用,也可以叫做java代理。 1. 代理 (agent) 是在你的main方法前的一个拦截器 (in...
  • qyongkang
  • qyongkang
  • 2012年07月29日 19:12
  • 31153

Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

想验证你对 jvm 配的一些调优参数有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你...
  • defonds
  • defonds
  • 2015年04月15日 20:45
  • 23166

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

一、JConsole是什么     从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使...
  • daguairen
  • daguairen
  • 2016年10月21日 21:39
  • 1305

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

一、JConsole是什么     从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使...
  • libaolin198706231987
  • libaolin198706231987
  • 2017年02月13日 21:46
  • 1191

Java自带的GUI性能监控工具Jconsole以及JisualVM简介

1 Jconsole 1.1 简介以及连接   JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具。下面以对tomcat的监控为例,...
  • chendc201
  • chendc201
  • 2014年04月04日 02:47
  • 11927

Java精确测量代码运行时间

Java精确测量代码运行时间: --------------- long startTime = System.nanoTime(); //開始時間 for(int i...
  • yearHeaven
  • yearHeaven
  • 2017年05月09日 09:15
  • 400

Java项目性能监控和调优工具-Javamelody

JavaMelody能够在运行环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql...
  • lk_blog
  • lk_blog
  • 2013年10月30日 23:25
  • 36887

java服务端监控平台设计

转自:http://blog.arganzheng.me/posts/java-monitor-platform.html 作者:arganzheng 需求 功能性监控(availabil...
  • a416090287
  • a416090287
  • 2016年01月26日 09:24
  • 5411

利用JMX来监控大部分java应用

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输...
  • arjick
  • arjick
  • 2011年03月22日 16:24
  • 45552

Java 开发者最有用的监控工具有哪些呢?

监测是当今生产环境中很重要的一个功能。错误和性能问题任何时间都会出现 —— 不仅仅在业务时间内 —— 所以好的监控工具需要 7 天 24 小时。目前有许多从不同角度解决这个问题的工具,所以弄清楚去采用...
  • MJM_49
  • MJM_49
  • 2017年08月17日 17:51
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java应用程序性能监控工具
举报原因:
原因补充:

(最多只允许输入30个字)