基于软件演化的性能分析

 2021-12-29 21:08:19

论文总字数:25734字

摘 要

Java语言作为目前的主流的软件开发语言之一,被众多开发者所运用,另一方面大量的Java软件应用也已经深入到生活,工作和学习的各个方面。但是由于Java语言自身在编译过程中,产生了大量冗余以及链接了很多间接编译,因此Java程序在运行过程中普遍存在运行缓慢,效率低下,容易卡死的问题,因此开发者在开发时需要对Java程序的性能进行监测,然后在对程序代码进行针对性的修改。本论文主要根据Java软件开发的特点,开发了对Java软件性能进行监测工具。并且对工具实现的细节和使用的方法进行了阐述。

本文的主要内容有:

  1. 阐述了Java软件性能的基本概念以及衡量指标,在借鉴目前已经成熟的Java软件性能监测分析器的基础上,总结出两个能够代表Java软件性能指标的数据-CPU利用率,内存占用。
  2. 针对本文选取的性能指标进行Java软件性能监测和分析工具的开发。在目前主流的Java程序性能分析器所使用的技术进行研究后,找到适合本次设计的技术路线-利用WMI,JNI,Java和C等技术开发出Java程序性能分析工具,并且介绍了本工具的设计和实现的过程和细节。
  3. 介绍了该Java程序性能分析器的的运行情况,并且使用该工具对某一开发中的软件进行性能监测和分析,展示实时的Java程序性能。

关键词:JNI,WMI,Java程序性能,CPU利用率,内存占用

Abstract

With the development of Java technology , the applications of Java software have had a deeply effect on the life, work and study. But the architecture of Java software determines that the Java software execution efficiency than C / C software, so the monitoring and analysis to the performance of Java software is very necessary. According to the Characteristics of Java software, this paper is wrote to tell how to develop a tool to monitor and analyze the performance of Java software . The implementation details and the usage of the tool are described in this paper.

The main contents of this paper are:

  1. It introduce the basic concepts of software performance and how to measure the performance of Java software.In reference to previous Java software performance optimization , it sum up the two indexes that can represent the performance of java software,namely data CPU utilization and memory usage.

2. According to the two indexes, this paper describes the development of the monitoring and analysis tool of the Java software. In reference to some mature Java performance analysis software , this paper introduces how to use the WMI, JNI, Java technology to develop a Java performance analysis tools, and introduces the details of the design of the tool and the realization of the process .

3. This paper introduces the performance analysis of the usage of the software, and how to use the tool to analysis and monitor different versions of the Java software .

Keywords: JNI, WMI, Java performance, CPU utilization, memory usage

目 录

摘 要 2

Abstract 3

第一章 绪论 5

1.1选题背景和意义 5

1.2国内外发展现状 5

1.2.1 JFluid技术与NetBeans Profiler 6

1.2.2 JVMTI 6

1.2.3 WMI 7

1.3论文的主要工作 11

1.4论文的组织结构 12

第二章 需求分析 13

2.1 Java语言效率的局限性 13

2.2现有性能分析工具的对比 13

2.3 需求分析与设计 15

第三章 系统设计 17

3.1 Java性能分析器总体设计 17

3.2 前端主程序 17

3.3 后端主程序 18

3.4 图形界面 18

第四章 系统实现 19

4.1 Java程序性能分析器的实现 19

4.2 接口设计与开发 23

4.3 数据处理 24

4.4 输入与输出 24

4.5 环境配置 28

第五章 系统运行 31

5.1 Java程序性能分析器的运行 31

5.2 Java程序性能分析器的不足与展望 33

致谢 35

  1. 绪论

1.1选题背景和意义

性能作为软件的基本质量属性,也是对软件进行评估一个重要的指标。很多软件都是因为或是最初实现的时候存在性能问题而无法使用,或是对安装和运行环境要求太高而导致无法大范围推广,最终导致软件无法被用户接受而消失。从另一方面来考虑,Java软件目前主要的用户为个人,安装和运行的环境也主要为个人电脑,但是个人电脑的CPU和内存相对来说比较小,因此Java软件作为主要运行在个人电脑上的软件,首先自身的运行和使用流畅的,其次就是对本地主机的CPU和内存占用不能太高,否则会影响用户本地主机上其他软件的运行。 因此如果软件存在性能问题,将产生一系列的负面影响,也将大大缩短软件的生命周期。

因此,性能对于软件来说至关重要,可以说是性能掌握着软件生命周期的咽喉。作为软件的重要属性,在开发过程中,开发者必须对Java程序的性能进行监测。

软件的开发,发布和维护是一个渐进变化并要达到预期目标的过程是一种演化过程。在软件系统开发完毕正式投入使用之后,用户需求发生了改变,或者要将该系统移植到另一个运行环境中,或者在新环境中需求发生了改变,都需要对软件系统进行修改和完善。

软件系统进行渐进完善并达到所希望的目标的过程就是软件演化。但是在软件演化的过程中,如何控制软件性能不会大幅度的降低,就是一个必须解决的问题了。这时,就需要用到软件性能分析器,利用分析器,对软件演化过程中的性能进行监测和跟踪,进一步进行分析,就可以对软件演化的过程进行有针对性的更改,这样就能够让软件既满足需求的改变也满足性能的要求。

1.2国内外发展现状

开发Java程序性能的监测和分析工具,首先就是要确定开发的技术路线。通过对目前主流的Java程序分析器进行研究后,了解到目前进行Java程序性能分析器开发的主流技术路线有:JFluid,JVMTI,WMI三项技术。下面将对这三项技术进行简单介绍。

1.2.1 JFluid技术与NetBeans Profiler

JFuid技术是目前开发的最新的性能分析技术,它的出现主要针对目前Java性能分析工具的缺点。现有Java性能分析工具最大的缺点就是,如果向用户提供更多的被监测信息,那么分析工具对正在运行的被监测程序的影响就会很大,分析结果将会出现很多错误,所以有可能导致在实际环境中存在的性能问题,在实验室中却不能够被复现。针对现有性能分析工具的缺点而开发的一种新的性能分析技术,Sun实验室研发了一种新的性能分析技术-JFuid技术。利用JVM提供的一种机制,即JVM的一个注入和删除附加代码的功能,JFluid技术可以让用户可使用任意开关监控被监测程序。同时,JFluid技术能够只运行部分监控的代码,动态的代码不改变程序的逻辑,但是可以获取JVM事件如对象分配,方法的调用等。然后工具将对这些传出的事件进行分析。

NetBeans Profile性能分析工具能够将Sun公司开发得JFluid技术集成到NetBeans集成开发环境中,NetBeans Profile的目的是将强大灵活的性能优化解决方案高度集成到IDE工作流程中。随着Java平台和Java应用程序的复杂度和软件的规模不断增大,保持它们的性能在要求的水平很难。利用动态字节指令技术开发性能分析工具使得性能分析工具变得易用,稳定,让我们能够把性能优化如单元测试,编码等一样应该成为开发周期的一部分。

1.2.2 JVMTI

JVMTI(Java虚拟机工具接口)是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以C/C 语言编写的动态共享库。

JVMTI Agent原理: java启动或运行时,动态加载一个外部基于JVMTI编写的动态模块到Java进程内,然后触发JVM源生线程附属监听器来执行这个动态模块的回调函数。在函数体内,你可以获取各种各样的JVM信息,注册感兴趣的JVM事件,甚至控制JVM的行为。

JVMTI从功能上大致可以分为4类:

Heap:获取所有类的信息,对象信息,对象引用关系,Full GC开始/结束,对象回收事件等。

线程与堆栈:获取所有线程的信息,线程组信息,控制线程,锁,得到线程堆栈,控制出栈,方法强制返回,方法栈本地变量等。

元信息:类信息,符号表,方法表,对象信息,域信息,方法信息等。

工具类:线程CPU消耗,类加载路径修改,系统属性获取等。

1.2.3 WMI与JNI

WMI技术是Windows 2K/XP管理系统的核心,利用WMI能够进入操作系统获取正在运行的进程信息。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。  使用WMI技术主要分为两个大的方面:获取信息和提供数据。其中“获取信息”需要WMI Classes(以后称为WMI类)。“提供数据”需要WMI Provider(以后称为WMI提供者),利用WMI技术可以获取本地和远程主机上的系统信息。

图1 WMI构架图

如图1所示,WMI主要分为三层结构:WMI Consumers(WMI使用者), 它位于WMI构架的最顶层,是WMI技术使用的载体。WMI Infrastructure(WMI基础结构),  WMI基础结构是Windows系统的系统组件。Managed object and WMI providers(托管对象和WMI提供者), WMI提供者是一个监控一个或者多个托管对象的COM接口。一个托管对象是一个逻辑或者物理组件,比如硬盘驱动器、网络适配器、数据库系统、操作系统、进程或者服务。和驱动相似,WMI提供者通过托管对象提供的数据向WMI服务提供数据,同时将WMI服务的请求传递给托管对象。从文件的角度来说,WMI提供者是由一个实现逻辑的DLL和承载着描述数据和操作的类的托管对象格式(Managed Object Format)文件组成。

JNI,从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。使用Java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java虚拟机环境下。这里就是为了与Windows操作系统进行交互,需要调用本地的C代码。

图2 JNI调用示意图

如图2所示,JNI作为一个中间件,充当了Java端和C端的联络者,通过JNI可以进行Java端和C端的互相调用。JNI在内部主要解决了Java与C互通的数据类型转化问题。在JNI中,通过JNI函数将Java数据类型和C数据类型进行互相转化。

对应的数据类型关系如下表:

Java 类型

本地 C 类型

实际表示的 C 类型

(Win32)

说明

boolean

jboolean

unsigned char

无符号,8 位

byte

jbyte

signed char

有符号,8 位

char

jchar

unsigned short

无符号,16 位

short

jshort

short

有符号,16 位

int

jint

long

有符号,32 位

long

jlong

__int64

有符号,64 位

float

jfloat

float

32 位

double

jdouble

double

64 位

void

void

N/A

N/A

表1 Java数据与本地C数据转化表

如图1所示,在JNI中,C类型的所有数据和Java型的所有数据都可以进行相互转化,其转化是准确的,一一对应的。

本设计利用图2的调用方式和表1的数据转化,在后端生成C 动态库,在Java前端声明本地方法,并在本机环境变量进行设置,从而能够顺利调用动态库,这样在Java类中就能够调用动态库中的相关函数,获取数据,从而在前端处理和显示。其实现流程如下图:

图 3 JNI实现流程图

图3为Java调用本地C函数的链接过程,因为Java在界面设计拥有相当多的开发工具包,而C语言能够进入操作系统获取进程信息,因此二者结合,可以用来开发Java程序性能分析器。

1.3论文的主要工作

本文工作是开发Windows操作系统下的本地Java程序的性能分析工具,该工具能够通过对操作系统进行访问,获取本地Java程序的性能指标,并能够进行图形化展示,达到对Java程序性能进行监测的目的。同时本次设计能够满足开发者对Java程序性能监测的需求,该工具能够解决监测Java程序在版本变迁中性能变化的问题。在前文已经谈到性能作为软件的一个重要质量指标,对于先天不足的Java软件来说,如何取得良好的性能就显得尤其重要。下面将对本文的主要工作做简单的介绍。本文所做的工作主要有以下三点:

1)简单介绍了性能的基本概念,对于本文而言,因为主要涉及的是Java程序,因此引出了Java程序的性能指标以及本文选取衡量Java程序性能的两个属性-CPU利用率和内存占用。

2)对现在主流的商用Java分析软件进行了介绍和分析,对其优缺点和实现的技术路线进行了取舍,制订了本次设计的Java性能分析软件的主要开发思路。在参考了当前这些主流分析软件的优点和实现的方法后,确定了本次设计所需要实现的内容与实现技术路线。

3)详细的介绍了本次开发的Java性能分析工具的设计和实现细节。并且对分析的运行情况和适应方法进行了说明,通过对某一进程的分析,展示了本次设计的Java程序性能分析器的对运行中的Java程序实时监测的效果。

因此本次设计的主要重点有:

a)使用WMI技术,在本地主机上获取Java程序的CPU信息和内存占用情况,然后通过JNI技术,在Java前端对WMI函数进行调用,Java前端获取数据后,通过折线图动态显示数据结果,并对数据进行统计和分析,从而获取Java程序在演化过程中性能的变化情况,然后通过人工的代码比对,分析出性能产生变化的原因。

b)因为是针对本地Java程序性能的研究,在对目前一些Java程序性能分析器进行研究后,在系统的前端设计方面主要模仿现在主流的操作模式,但是在功能进行简化。那么如何衡量Java程序的性能呢?

软件性能主要表现在以下三个方面:硬件资源的占用(CPU,总线,IO,内存和网络);逻辑资源的占用(缓存,锁,信号量);进程资源的占用(进程,线程)。

对于单机Java程序而言,在硬件资源占用上,对网络和总线的占用是很少的,这两个指标在软件演化的过程中变化不大,没有统计意义。Java程序对逻辑和进程资源的占用,以缓存为例,程序占用了资源,却有可能没有完全使用,因此逻辑和进程资源的占用来衡量软件性能可能导致误差太大。因此,这里本课题选用CPU,内存这两个指标来作为衡量的标准,因为两个指标对于Java程序而言,是满利用率的。

本次设计的难点有:

a)WMI工具接口的使用,获取Java程序入口以及CPU利用率和内存占用数据

b)如何利用JNI技术在Java前端调用C 动态库

c)前端Java视图的动态刷新

1.4论文的组织结构

第一章介绍了开发Java程序性能分析器的重要性和意义,分析了目前国内外主要进行开发分析器的主要技术,并对这些技术进行了简单的介绍,在第一章结尾简单介绍了论文的主要工作和研究重点难点。

第二章对开发Java程序性能分析器需求进行了分析,从Java语言代码的效率上进行分析,总结出Java程序在性能上本身的不足,而对于Windows操作系统,Java程序作为桌面操作系统主要的支持程序,在人们的生活学习中也被广泛的利用,但是对于用户计算机来说,计算机的性能是有限的,因此对于本地Java程序的性能必须加以控制。

剩余内容已隐藏,请支付后下载全文,论文总字数:25734字

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;