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

供稿:hz-xin.com     日期:2024-05-18
在实际部署的生产环境能够以较低的风险及成本实现对业务逻辑级别性能问题的追踪。本文将介绍如何集成 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。

浅谈如何找到Java 正确的学习路径
答:重点:Java基本语法(循环结构,数据类型,数组,运算符等)、Swing,awt,事件机制、文件输入输出流处理等;难点:面向对象思想的理解(接口、类等)、线程、socket网络编程等。JavaEE部分:在学习了JavaSE之后,你可以尝试着慢慢过渡到JavaEE。当然,学习JavaEE也需要很多其他技术的支撑,比如数据库技术,...

android 怎么把第三方的apk集成到自己的应用中
答:修改如下所示:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional Only compile source java files in this apk.LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := VTestLOCAL_CERTIFICATE := platformLOCAL_STATIC_JAVA_LIBRARIES := ...

普通开发人员,怎么提升到JAVA高级开发工程师
答:这样您在开发一个项目时思路会开阔一些,比如您 会想到把SQL语句与您的JAVA代码分开,再比如您会考虑把您的业务逻辑配置到XML或者数据库中,这样整个项目就很容易扩张了。五、 熟悉主流数据库。其实真正比较大的项目都是有人专门做数据库的,但往往很多项目要求作为(高级)工程师的您也参与数据库的设计...

求一个java文本框型计算器!就是输入数字到文本框里然后点计算按钮再将...
答:import javax.swing.*;import java.awt.*;import java.awt.event.*;class Calculator extends JFrame implements ActionListener { JTextField Display = new JTextField(16);JButton[] btn = new JButton[10];JButton btnPlus = new JButton(" + ");JButton btnMinus = new JButton(" -...

java 类是公共的,应在名为.java 的文件中声明
答:1、首先在电脑中打开新建的Java项目,新建一个package,在包中新建一个Java 类,如下图所示。2、定义抽象类User,包含了属性name、age;抽象方法write()。3、再创建一个子类Pstu,继承父类User,然后重写这些方法。4、最后在main主方法中,调用子类Pstu,然后依次调用方法write和drink,查看打印结果,如...

java 应届生问个问题
答:Java语言本身降低了编程的难度(相对C语言而言),这样使得更多的人可以成为Java程序员。参差不齐就在所难免。在实际的基于Java的项目中你会大量使用各种各样的Framework。这些Framework在提供了强大的开发支持同时也向开发人员屏蔽了更加底层的实现。作为一个程序员,你不仅需要了解这些Framework如何使用,还...

java web应用如何实现单点登录
答:实现方式一:父域 Cookie 实现方式二:认证中心 实现方式三:LocalStorage 跨域 补充:域名分级 在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或...

...SE Development Kit8 ,但不知道怎样打开JAVA的编程界面
答:想要简单快捷,就去下个Eclipse 或者 IDEA,Java的集成开发界面,写Java代码So Easy,新建Java文件,写好之后,直接运行按钮就行了。初学者建议了解下Java程序编译和运行的方式,大致如下:java程序编写的话,任何一个文本文件都能写java程序,保存为.java格式,例如:HelloWorld.java JDK 的 bin目录下有...

请问java web项目+tomcat服务 的运作流程是怎么样的,像怎么部署到服务器...
答:tomcat是一个web容器,java web项目相当与容器中的一个元素 ,当把java web项目部署到服务器的时候 就相当于在容器里面加入了一个元素 tomcat启动的时候 tomcat容器会获得里面元素的相关信息 比如web项目的名称 当用户请求服务器的时候 首先根据请求的一级域名找到你启动的tomcat容器,容器在分析一级域名...

Java小程序与Java应用程序之间有何差别
答:这两种程序主要区别:1、小应用程序只能在与Java兼容的容器中运行,可以嵌入在HTML网页内,在网络上发布,当网页被浏览时,在浏览器中运行。小应用程序的运行还受到严格的安全限制,例如它不能访问用户计算机上的文件。Java应用程序没有这些限制,也不支持网页嵌入和下载运行。2、小应用程序和应用程序在代码...