如何集成Perf4j到Java应用程序中并生成性能数据

在实际部署的生产环境能够以较低的风险及成本实现对业务逻辑级别性能问题的追踪。本文将介绍如何集成 Perf4j 到 Java 应用程序中并生成性能数据。

系统日志是应用程序问题诊断及运行维护的重要工具。Logback、Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数、状态的变化及异常信息通过日志输出。本文将要介绍的 Perf4j 是一款专门用于 Java 服务器端代码计时、记录日志和监控结果的开源工具包。Perf4j 对常用日志工具包进行了扩展,能够将得到的原始性能数据进行统计并发布到可定制的输出源,如控制台、日志文件、JMX 等。Perf4j 提供了多种方式与 Java 代码集成,开发和系统维人员能够灵活地将 Perf4j 的 API 嵌入到各种不同架构的应用程序中。

Perf4j 目前依托于开源项目协作平台 Codehaus 进行文档及代码管理,下一步该项目计划迁移到 Github 平台,以便更多的社区及开发人员可以参与到开发及维护中来。Perf4j 欢迎使用者提出新的功能需求并且鼓励将定制或扩展的代码贡献到 Perf4j 源码中。本文中示例代码使用的 Perf4j 版本是 0.9.16,读者需在下载类包或配置 Maven 时留意。

阅读文章之前,您要对 Java 注解、JMX、面向方面编程有一些了解。特别是 JConsole 的使用及 Spring AOP 的配置方式要较为熟悉。

文章首先阐明在何种应用场景下应优先考虑使用 Perf4j。然后是具体讲解 Pef4j 与应用程序的集成方式。最后会介绍如何将收集的数据生成便于分析的可视化图表。

应用场景

在 Java 平台上遇到性能问题时,如 CPU 占用过高、系统响应缓慢,通常的分析方法是使用 JVM 剖析工具在系统瓶颈临界点前一段时间抓取 CPU 占用分布,再对 CPU 占用率最高的几个方法排查。Perf4j 的优势在于能够持续跟踪统计所关注功能代码的执行效率,对于前后两个版本出现较大差异的方法进行深入分析,可以在开发周期中尽早发现问题。Perf4j 还可以用在产品环境中,从运营的早期开始,将其统计的数据做为系统的性能和健康指标长期监测。

首选 Perf4j 的应用场景:

Java 本地代码调用(JNI) 分布式系统、集群部署 面向服务体系结构(SOA) 远程方法调用(RMI)

开发人员必须将本地方法、远程方法及 Web services 的性能问题隔离出来,以防干扰对 Java 应用程序本身的分析。通过日志记录则是最简单的方式;采用分布式架构或集群部署的系统相对复杂,不同的网络环境、基础硬件和操作系统的差异、虚拟主机中资源与配置的差异等造成很难采用统一的工具来监测代码级别的性能指标。而日志记录则可以轻松加入到各种程序中,且是资源与时间成本最低的方式。Perf4j 提供了 CSV 格式的转换工具,开发人员可以借助第三方工具方便地将统计结果汇总分析。

集成到应用程序

下面将分两种方式具体讲述如何利用 Per4j 提供的 API。在实际的项目中,应根据现有的程序框架及监测目的灵活选择。另外,针对 WebSphere 应用服务器的自有日志系统,还必须采取额外的措施来确保 Perf4j 的正常工作。

对代码段计时

Perf4j 中 org.perf4j.StopWatch 是整个 API 中的基础工具。这是一个封装良好的计时器。可以把 StopWatch 嵌入到代码中任何地方。这种方式往往使得复杂的方法得到分解,从而有利于精确定位问题的根源。以下通过清单 1 和清单 2 来介绍其具体用法。

清单 1.StopWacth 基本用法

public static void basicStopWatch() throws InterruptedException{ // 创建 StopWacth 时开始计时,之后也可以用 stopWatch.start() 重新设定计时开始时间点 StopWatch stopWatch = new StopWatch("TransactionA"); // 执行需要计时的代码 Thread.sleep(2 * 1000L); String result = stopWatch.stop(); System.out.print(result); }

清单 1 中最后输出的结果示例:start[1340442785756] time[1995] tag[TransactionA]。在构造函数中设定 tag[TransactionA] 用来区分不同的业务逻辑,可以把它看成是性能分析中的事务(Transaction)。

如果需要将多段代码分开统计,可采用 LoggingStopWatch 类的 lap() 方法定义多个事务。

清单 2.LoggingStopWatch 用法

public static void loggingStopWacth() throws InterruptedException{ LoggingStopWatch stopWatch = new LoggingStopWatch(); // 设定阈值,小于此阈值的结果将不会被记录下来 stopWatch.setTimeThreshold(1*1000L); Thread.sleep(2 * 1000L); // 停止当前计时,开始新的起始时间点 stopWatch.lap("TransactionB"); Thread.sleep(500L); stopWatch.stop("TransactionC"); }

清单 2 中使用了 LoggingStopWatch 类,其 stop() 方法只是将执行时间数据通过 System.err.println() 输出。若与 Log4j 框架集成,则需要使用 LoggingStopWatch 的子类 Log4JStopWatch, 目前 Perf4j 还支持 Apache Commons Logging、java.util.logginLogback,对应使用 CommonsLogStopWatch、 JavaLogStopWatch、Slf4JStopWatch。

时间: 2024-08-03 21:21:58

如何集成Perf4j到Java应用程序中并生成性能数据的相关文章

分布式企业Java应用程序中实现服务器组协调

如今,许多企业应用程序都由一组合作的分布式进程和服务器交付.例如,可向几乎所有流行的 Java 企业服务器的 Web 请求提供服务器集群功能,这些服务器还可以提供有限的配置选项,如服务器权重和配置重新加载. 虽然大多数 Java 企业服务器具有集群的内置支持,但对于自定义用例来说,在应用程序级并没有现成提供这种支持.作为软件开发人员,我们应该如何管理涉及分布式任务协调或支持多租户应用程序的用例?(多租户应用程序 是要求实例在整体服务器集群或组的子集上被隔离的应用程序.)对于这些类型的用例,我们必

如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图(转)

window|程序 如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图在 Java 应用程序中加载位图文件的逐步指南 作者:Jeff West 和 John D. Mitchell 摘要目前,标准的 getImage() 方法仅支持 GIF 和 JPEG 图像.尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序.Jeff West 撰写的这篇技巧提供了加载

在JAVA应用程序中如何实现FTP的功能 (转)

程序 在JAVA应用程序中如何实现FTP的功能 大连捷通电脑技术有限公司 王 淼 ---- 在JAVA的编程中,您也许会遇到FTP方面的编程,本文就来演示如何实现它. ---- 本程序是由JBUILDER2.0来开发的,为了节约篇幅我只列出主要的三个部份.FtpList 部分是用来显示FTP服务器上的文件(附图略).GetButton部分为从FTP服务器下传一个文件.PutButton 部分为向FTP服务器上传一个文件.别忘了在程序中还要引入两个库文件(import sun.net.*,impo

如何将网站上的json数据导到我的java小程序中?

问题描述 如何将网站上的json数据导到我的java小程序中? 我刚学完java基础,打算单纯用java做一个股票数据查询小程序.在聚合数据上找到了一个资料:http://www.juhe.cn/docs/api/id/21 ,我不知道要怎么弄了. 解决方案 发送http请求,读取返回的json数据,存到文件等,然后java程序访问文件 解决方案二: JAVA用POST向网页发送请求,接收数据 下面是一个范例程序: import java.io.BufferedReader; import ja

用java向mysql中导入大量txt数据

问题描述 用java向mysql中导入大量txt数据 用java向mysql中导入大量txt数据大约一百万条,怎样能用jdbc高效的存储,不用jdbc有其他方法也可以,重要的是,快求大神指点一二,尽量不要发百度连接啥的,我差不多都找过了,说的详细点,跪求 解决方案 批处理..什么?批处理还不爽?那就批处理这种语句:insert into XXX(abcdd) values(11111)(222222)(33333)还不爽?那就多线程去跑.一百W数据不大.连本地库应该数秒就可以解决 解决方案二:

用pb12开发两个程序,这两个程序中要传递一些数据

问题描述 用pb12开发两个程序,这两个程序中要传递一些数据 用pb12开发两个程序,这两个程序中要传递一些数据,该怎么去实现简单一点,具体用哪些方法去实现.这两个程序是放在局域网中的.需要导入哪些插件或.pbl等吗? 解决方案 共享数据库.文件(windows共享文件)

Java数据库程序中的存储过程设计

程序|存储过程|设计|数据|数据库 本文阐述了怎么使用DBMS存储过程.阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言),但是,并不要求你有任何存储过程的编程经历. 存储过程是指保存在数据库并在数据库端执行的程序.你可以使用特殊的语法在Java类中调用存储过程.在调用时,存储过程的名称及指定的参数通过JDBC连接发送给DBMS,执行存储过程并通过连接(如果有)返回结果

在PHP和Java应用程序中使用XML数据库

开始之前 本教程的目标读者是使用XML并希望了解原生XML数据库(本教程中为 IBM DB2 Express-C 9.5)的PHP和Java开发人员.虽然对PHP和Java编程有所了解很有帮助,但是不熟悉这些技术不影响阅读本教程.熟悉XMLDOM 也很有帮助. 关于本教程 本教程说明了如何利用原生XML数据库压缩开发周期.作为示例,我们将修改XML模式并观察代码中的相应变化.开发人员将了解到在PHP和Java技术中使用原生XML数据库所必须掌握的基本知识,包括: 连接到数据库(DB2 Expre

Java应用程序中动态分配CPU资源

一个多任务系统需要在任务之间实现QoS(Quality of Service)管理时,如果CPU资源的分配基于Java线程的优先级,那么它在不同平台上运行时的效果是很难预测的. 本文利用协调式多任务模型,提出一个与平台无关.并且能在任务间动态分配CPU资源的方案. 现在,由于计算机系统已经从人机交互逐步向机机交互转化,计算机和计算机之间的业务对于时间的要求非常高.软件系统对于业务的支持已经不仅表现为对不同业务的逻辑和数据(算法+数据结构)支持,而且还表现为对同时处理不同任务的时效性(任务响应速度