CN104142817B - 在Java应用中测量用户资源使用量的方法与装置 - Google Patents
在Java应用中测量用户资源使用量的方法与装置 Download PDFInfo
- Publication number
- CN104142817B CN104142817B CN201310170698.7A CN201310170698A CN104142817B CN 104142817 B CN104142817 B CN 104142817B CN 201310170698 A CN201310170698 A CN 201310170698A CN 104142817 B CN104142817 B CN 104142817B
- Authority
- CN
- China
- Prior art keywords
- unit
- java
- system resource
- class
- resource
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种在Java应用中测量用户资源使用量的方法与装置。该方法包括:响应于接收到用户发起的Java应用访问请求,从应用访问请求中,识别用户身份信息;在根据业务逻辑处理Java应用访问请求的过程中,调用Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与Java系统资源类单元相对应的资源测量代码单元,资源测量代码单元在Java系统资源类单元被调用的过程中,测量调用Java系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中。本发明提供的技术方案能够在Java应用中准确方便地测量用户实际所占用的系统资源使用量。
Description
技术领域
本发明涉及计算机应用领域,特别涉及一种在Java应用中测量用户资源使用量的方法与装置。
背景技术
多租户Java应用是基于Java应用软件平台,向多个租户同时提供在线服务的软件即服务(Software-as-a-service,SaaS)应用。
租户按需使用应用平台提供的应用服务,应用平台按租户使用量对其进行计费,例如,按照使用时间或者服务种类计费。一个租户下可能包含多个用户。在使用服务的过程中,租户中的用户通过托管应用程序与应用平台建立单独的会话,使用应用平台提供的服务。应用平台通过提供应用实例为用户提供服务,用户将占用应用平台的CPU、内存等系统资源。
在多用户应用或者大型应用中,由于多个用户共享相同的应用实例,每个应用实例可能需要为一部分用户提供应用服务,因此,在这种情况下,不同的用户可能使用相同的系统资源,如何准确地测量每个用户实际使用的系统资源是非常困难的。现有技术中,测量用户占用系统资源量的方法主要有以下两种。
一种是服务资源估算法,即预先估算用户需要使用的每个服务大致所要占用的系统资源量,将用户每次调用的服务的系统资源进行累加,累加的是一段时间内某类资源的估算均值。例如,估计用户将使用的服务i,服务i的调用次数为Ni,服务i消耗的CPU周期数为Ci,总共用n服务,则用户消耗的CPU资源为ΣCi*Ni,i=1,2…n。可见,由于这种方法所获得的用户系统资源的使用量为粗略的估算结果,因此,资源测量的精度低。
还有一种方法是使用专用资源应用程序编程接口(Application ProgrammingInterface,API)进行测量。由应用平台提供测量资源的专用API,在应用程序需要测量资源的地方显式调用测量资源API进行资源测量。这种方法由于需要使用应用平台提供的专用测量API,应用平台托管的每个应用都需要显式调用该专用API接口,因此,托管应用难以移植,增加了应用开发的工作量。
发明内容
根据本发明实施例的一个方面,所要解决的一个技术问题是:提供一种在多用户Java应用中测量用户资源使用量的方法与装置,在多用户Java应用中方便准确地测量每个用户实际所使用的系统资源。
本发明实施例提供的一种在Java应用中测量用户资源使用量的方法,所述方法包括:
响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述用户身份信息;
在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源测量代码单元;
所述资源测量代码单元在所述Java系统资源类单元被调用的过程中,测量调用所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
优选地,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述方法还包括:
根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类单元;
识别是否已经加载所述Java系统资源类单元;
若已经加载所述Java系统资源类单元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作;否则,将所述资源测量代码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元,并加载生成的所述Java系统资源类单元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作。
优选地,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
优选地,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为CPU占用时间;
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
优选地,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内存占用大小;
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大小,作为所述内存占用大小。
优选地,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为IO数据量大小:
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据量大小,作为所述IO数据量大小;或者
在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述IO数据量大小。
优选地,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述方法还包括:
利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述资源测量代码单元;
响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需要的对象单元;
利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资源类单元。
优选地,所述方法还包括:
将所述用户身份信息写入与所述用户身份信息向对应的用户上下文信息中;
所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
优选地,所述用户身份信息为所述用户所属的租户标识;
所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
本发明所提供的一种在Java应用中测量用户资源使用量的装置,所述装置包括:
应用服务入口单元,用于响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述用户身份信息;
应用业务逻辑单元,用于根据业务逻辑处理所述Java应用访问请求,在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源测量代码单元;
资源测量代码单元,用于在所述Java系统资源类单元被调用的过程中,测量调用所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
优选地,所述应用业务逻辑单元,还用于在调用所述Java应用访问请求所需要的Java系统资源类单元之前,根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类单元;识别是否已经加载所述Java系统资源类单元;响应于已经加载所述Java系统资源类单元,调用所述Java应用访问请求所需要的Java系统资源类单元的操作;
资源类转换器单元,用于响应于未加载所述Java系统资源类单元,将所述资源测量代码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元;
类加载器单元,用于加载生成的所述Java系统资源类单元。
优选地,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
优选地,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为CPU占用时间;
所述资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
优选地,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内存占用大小;
所述资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大小,作为所述内存占用大小。
优选地,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为IO数据量大小:
所述资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据量大小,作为所述IO数据量大小;或者在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述IO数据量大小。
优选地,所述装置还包括:
Java应用容器单元,用于在调用所述Java应用访问请求所需要的Java系统资源类单元之前,利用对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述资源测量代码单元;
所述应用业务逻辑单元,还用于响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需要的对象单元;利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资源类单元。
优选地,所述装置还包括:
上下文信息管理单元,用于将所述用户身份信息写入与所述用户身份信息向对应的用户上下文信息中;
所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
优选地,所述用户身份信息为所述用户所属的租户标识;
所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
基于本发明上述实施例提供的在Java应用中测量用户资源使用量的方法与装置,响应于接收到用户发起的Java应用访问请求,识别用户身份信息,调用Java应用访问请求所需要的Java系统资源类单元,通过在Java系统资源类单元中包含与Java系统资源类单元相对应的资源测量代码单元,从而能够在Java系统资源类单元被调用的过程中,利用资源测量代码单元准确地测量用户实际所占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中,从而有效提升了用户资源使用量的测量精度,同时,避免了依赖于专用API,不需要修改现有应用程序,便于应用的快速移植。
通过以下参照附图对本发明的示例性实施例的详细描述,本发明的其它特征及其优点将会变得清楚。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际的比例关系绘制的。相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。
构成说明书的一部分的附图描述了本发明的实施例,并且连同说明书一起用于解释本发明的原理。
参照附图,根据下面的详细描述,可以更加清楚地理解本发明,其中:
图1示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例的流程示意图;
图2示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例的流程示意图;
图3示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例的流程示意图;
图4示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例的结构示意图;
图5示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例的系统架构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。应注意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置不限制本发明的范围。
以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明及其应用或使用的任何限制。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为授权说明书的一部分。
在这里示出和讨论的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它示例可以具有不同的值。
参见图1所示,图1示出本发明所提供的在Java应用中测量用户资源使用量的方法一种实施例的流程示意图。该实施例提供的在Java应用中测量用户资源使用量的方法包括以下操作流程。
101,响应于接收到用户发起的Java应用访问请求,从应用访问请求中,识别用户身份信息。
102,在根据业务逻辑处理Java应用访问请求的过程中,调用Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与Java系统资源类单元相对应的资源测量代码单元。
103,资源测量代码单元在Java系统资源类单元被调用的过程中,测量调用Java系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中。计数信息可以是针对各种系统资源使用量的计数器中。
本发明上述实施例提供的方法中,识别用户身份信息,调用Java应用访问请求所需要的Java系统资源类单元,通过在Java系统资源类单元中包含与Java系统资源类单元相对应的资源测量代码单元,从而能够在Java系统资源类单元被调用的过程中,利用资源测量代码单元准确地测量用户实际所占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中,从而有效提升了用户资源使用量的测量精度。
对于多租户应用来说,用户可以属于某个租户。一个租户下拥护多个用户。例如,租户可能为企业,用户则是企业下的员工,用户数可能比租户数要大1到2个数量级。此时,在这种场景下,租户作为订购和支付包括资源费用和功能费用等应用费用的对象。
因此,根据本发明装置实施例的一个具体示例,用户身份信息为用户所属的租户标识;用户身份信息相对应的计数信息为租户标识所对应的计数信息。
例如,用户身份信息可以是包含租户标识的用户标识。如用户标识a1@com1、a2@com1,其中包含的租户标识为com1。在操作101识别用户身份信息的操作中,具体识别用户所属的租户标识。在操作103中,用户身份信息相对应的计数信息可以是用户所属的租户标识所对应的计数信息中,从而将资源的计数归属在租户标识上,实现对租户根据使用量进行收费,而不必对单个用户进行收发。
根据本发明方法一种具体实施例,在执行图1中101的操作之后,该方法还可以包括:
201,将用户身份信息写入与用户身份信息向对应的用户上下文信息中。资源测量代码单元从用户上下文信息中获得用户身份信息,以将系统资源使用量记录在与用户身份信息相对应的计数信息中。
一个用户会话为一个用户开始访问应用平台到结束访问这段时间的与应用平台之间的会话。会话结束可以是因为用户退出应用或会话超时。当用户访问应用平台时,可以由应用平台为用户创建与该用户对应的用户上下文信息,例如,以会话上下文对象(SessionContext)的方式创建。户上下文信息可以包括会话标识、会话开始时间、用户标识等信息,通常采用线程静态结构体进行保存。
通过设置用户会话上下文信息,以将Java应用访问请求转发给具体的应用业务逻辑单元,进一步传递给资源测量代码单元,从而获得用户身份信息,以将系统资源使用量记录在与用户身份信息相对应的计数信息中。
可以通过多种方式将该用户上下文信息传给具体应用的应用业务逻辑单元,比如将SessionContext通过函数参数传给处理该会话的应用业务逻辑单元,从而在该单元获知当前在处理的是哪个用户的会话。
根据本发明方法实施例的一个具体示例,在调用Java应用访问请求所需要的Java系统资源类单元之前,该方法还包括:
301,根据应用业务逻辑,分析获得Java应用访问请求所需要的Java系统资源类单元;
302,识别是否已经加载Java系统资源类单元;
若已经加载Java系统资源类单元,执行调用Java应用访问请求所需要的Java系统资源类单元的操作;否则,执行303将资源测量代码单元注入到对应的原始Java系统资源类单元中,生成包含资源测量代码单元的Java系统资源类单元,304加载包含资源测量代码单元的Java系统资源类单元。
可以采用不同的方式来实现303操作中将资源测量代码单元注入到对应的原始Java系统资源类单元中。
例如,将资源测量代码单元加入到原始Java系统资源类单元的子类的定义中,生成包含资源测量代码单元的Java系统资源类单元。
新生成的包含资源测量代码单元的Java系统资源类单元可以为原始Java系统资源类单元(即父类单元)的子类单元,从而在应用调用该父类单元时,返回包含资源测量代码单元的子类单元,根据子类单元的定义,利用子类单元所包含的资源测量代码单元进行系统资源测量。
上述资源测量代码单元的注入过程,对上层应用来说是完全透明的,用户在进行Java应用访问请求并获得应用服务的过程中,在用户对测量过程没有感知的情况下,完成对系统资源占用量的测量。
在具体实现中,可以利用多种Java的动态替换类或动态注入代码的方式将资源测量代码单元注入到对应的原始Java系统资源类单元中,生成Java系统资源类单元,并加载Java系统资源类单元。
一种方式可以是修改原始Java系统资源类,生成该Java系统资源类的子类,作为Java系统资源类。从而加载Java系统资源类的子类。例如通过Java的Thread类,创建Thread类的子类ThreadEX,再ThreadEx覆盖Thread的run方法,在子类的run方法中加入资源测量代码。
另一种做法是使用Java的Instrumentation代理机制。Java Instrumentation机制允许通过提供"Java代理"来检查和修改加载的类字节代码。通过先做一个实现ClassFileTransformer接口的资源转换类,将Thread类的class替换成ThreadEX类的class,其中,ThreadEX不需要是Thread的子类,但需要提供和Thread类完全一样的方法,再将资源转换类通过Instrumentation的addTransformer方法注册到系统类加载器中,系统类加载器在加载资源类Thread时,就会调用转换器加载注入了监测代码的ThreadEX。
根据具体的测量方式,可以采用不同的方法通过Java系统资源类测量用户所使用的系统资源。示例性地,Java系统资源类单元包括可以线程调度器单元、对象(Object)构造器单元、文件读写(IO)器单元中的至少一种。相应地,资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
可以为每个租户所消耗的每类系统资源设置一个计数信息,分别记录每个租户对每类系统资源的累计使用量。
以下分别示例性地展示其中三种系统资源的测量方法。
CPU占用时间的测量体现了对CPU资源的占用。例如,用户在一段时间内使用的CPU时间(秒)或CPU时钟周期(次),在确定的服务器的CPU主频、CPU时间后可以通过换算获得CPU时钟周期。通过API获取每条线程的CPU时间计数器,通过测量用户使用过的所有线程的CPU时间计数器的变化量,从而得到用户消耗的CPU时间。
内存占用大小体现了对内存资源的占用。例如,用户在一段时间内创建的内存对象占用的总内存的大小(MB)。在Java中,内存对象可以是通过new操作创建的,在创建内存对象之后,可通过API获取创建的内存对象大小。
IO数据量大小体现了对IO资源的占用。例如,用户在一段时间内读取或写入的总数据量(MB),通过IO类的read和write方法进行IO读写操作,通过记录每次read或write的数据量即为用户消耗的IO资源。以下更具体地展示对各种资源测量的部分实现方式。
根据本发明方法实施例的一个具体示例,Java系统资源类单元为线程调度器单元,系统资源使用量为CPU占用时间。在具体实现中,线程调度器可以是由Java虚拟机(JVM)控制。资源测量代码单元测量调用Java系统资源类单元占用的系统资源使用量,具体可以通过在调用线程调度器单元加载线程子类运行时,测量运行线程子类所占用的CPU时钟周期个数,作为CPU占用时间。
对于通过线程调度器对CPU占用时间的测量方法可以有以下两种:方法1:Thread的子类ThreadEX,重载run方法
在子类ThreadEX的run方法中增加以下资源测量代码单元:
long cputime=get_CPU_Time_Counter_of_Current_Thread();
//记录运行开始时间cputime
super.run();
//父类开始运行
long cpucost=get_CPU_Time_Counter_of_Current_Thread()-cputime;
//运行结束时间减去运行开始时间,即为CPU耗时
record_cpu(rentid,cpucost);
//记录该用户标识rentid与其CPU耗时cpucost
方法2:定义Java系统线程调度器的子类,当根据业务逻辑,调用该子类执行时,测量运行线程子类所占用的CPU时钟周期个数。CPU占用时间描述的是线程实际占用CPU的时钟周期个数,可以为线程执行的CPU时间计数器之差,从而获得CPU占用时间。
根据本发明方法实施例的一个具体示例,Java系统资源类单元为对象构造器单元,系统资源使用量为内存(Memory)占用大小。
测量调用Java系统资源类单元占用的系统资源使用量,具体可以包括:
在调用对象构造器单元构造对象子类运行时,测量对象子类所占用的内存大小,作为内存占用大小。
具体实施例对Memory大小的测量方式,可以通过以下方法来实施。
可考虑只对特定的实体类进行测量,为需测量的实体类定义测量子类,即对内存消耗较大的子类定义包含测量代码单元的子类。
例如,采用对象工厂ObjectFactory创建对象时,可定义对象工厂应用的子类ObjectFactoryEX,在其createObject方法中实现:
Object obj=super.createObject();
//创建子类
long objsize=get_Object_size(obj);
//获取对象子类所占用的内存大小,作为内存占用大小
record_memory(rentid,objsize);
//记录用户标识rentid与对应的内存占用大小
return obj;
根据本发明方法实施例的一个具体示例,Java系统资源类单元为文件读写器单元,系统资源使用量为IO数据量大小:
测量调用Java系统资源类单元占用的系统资源使用量,具体包括:
在调用文件读写器单元加载输入流子类运行时,测量输入流子类读取的数据量大小,作为IO数据量大小;或者
在调用文件读写器单元加载输出流子类运行时,测量输出流子类写入的数据量大小,作为IO数据量大小。
具体地,可以分别扩展各类InputStream类的read方法和OutputStream类的write方法,分别测量输入流子类读取的数据量大小以及测量输出流子类写入的数据量大小。
上述实施例中,对于其他非核心系统资源类也可以由JavaEE容器自带的资源类,使用上述方法进行测量。
对于部分Java系统资源类来说,部分核心类是由启动类加载器(BootstrapLoader)加载,例如Object、File、String,对这些类进行修改可以是直接替换系统类库中的类文件,或者修改Java的启动类加载器。以下展示另一种实施方式。
根据本发明方法实施例的一个具体示例,在调用Java应用访问请求所需要的Java系统资源类单元之前,该方法还包括:
利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,对象单元包含资源测量代码单元;
响应于Java应用访问请求,从测量系统资源类的对象单元中选择所需要的对象单元;
利用所选择的对象单元的定义创建Java应用访问请求所需要的Java系统资源类单元。
由于Java应用容器中提供对象工厂(ObjectFactory)或资源类工厂(ResourceFactory),用于创建应用中所有的资源类对象。因此,可以利用对象工厂用于创建任意的类,扩展对象工厂不仅可以创建内存测量子类单元,还可以创建线程测量子类单元、IO测量子类单元。
在对象工厂中根据系统资源测量策略为需测量的系统资源类创建添加了资源测量代码的测量系统资源类子类。
对象工厂可以有两个创建对象的方法,分别用于创建带参数的对象和不带参数对象:
Object createObject(String className);//用于不带参数的对象创建
Object createObject(String className,Object[]args);//用于带参数的对象创建。
例如,创建线程可以调用:
Thread thread=create("java.lang.Thread")
对象工厂在创建对象时先通过类名判断该资源类是否为需要测量的资源类,如果是需测量的资源类则返回其添加了资源测量代码的子类。
为了便于应用移植,可以在Java应用编译前先扫描Java代码中的所有new关键字的语句:Thead thread=new Thread();Thread将其替换为对象工厂调用语句:thread=create("java.lang.Thread")。可以通过如下流程来实施:
1预先扫描Java应用代码,将带new关键字的语句替换为使用对象工厂创建对象的语句,编译并打包部署Java应用。
2响应于接收到用户发起的Java应用访问请求,识别用户身份信息,在用户会话上下文信息(或称为用户上下文信息)中保存用户身份信息,其中,用户会话上下文信息可以通过会话线程变量或全局的哈希表保存;
3根据业务逻辑,应用程序通过Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,对象单元包含资源测量代码单元;其中,所创建的测量资源类的对应单元的定义可保存在对象工厂的哈希表中,哈希key为类名;
4对象工厂单元利用应用程序传入的类名搜索在步骤3中所创建的测量系统资源类的对象单元的定义,如果存在对应的系统资源类定义,则选择所需要的对象单元,用该系统资源类的定义创建一个系统资源类;对于不存在对于的系统资源类定义,则直接用Java原有的类定义创建类;
5当应用程序或系统执行利用所选择的对象单元的定义创建所需要的Java系统资源类单元,触发资源测量代码单元测量对于的系统资源使用量。
参见图4所示,图4示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例的结构示意图。该实施例提供的在Java应用中测量用户资源使用量的装置包括:
应用服务入口单元401,用于响应于接收到用户发起的Java应用访问请求,从应用访问请求中,识别用户身份信息;
应用业务逻辑单元402,用于根据业务逻辑处理Java应用访问请求,在根据业务逻辑处理Java应用访问请求的过程中,调用Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与Java系统资源类单元相对应的资源测量代码单元;
资源测量代码单元403,用于在Java系统资源类单元被调用的过程中,测量调用Java系统资源类单元占用的系统资源使用量,并将系统资源使用量记录在与用户身份信息相对应的计数信息中。
根据本发明装置实施例的一个具体示例,用户身份信息为用户所属的租户标识;用户身份信息相对应的计数信息为租户标识所对应的计数信息。
根据本发明装置实施例的一个具体示例,应用业务逻辑单元,还用于在调用Java应用访问请求所需要的Java系统资源类单元之前,根据应用业务逻辑,分析获得Java应用访问请求所需要的Java系统资源类单元;识别是否已经加载Java系统资源类单元;响应于已经加载Java系统资源类单元,调用Java应用访问请求所需要的Java系统资源类单元的操作;
资源类转换器单元404,用于响应于未加载Java系统资源类单元,将资源测量代码单元注入到对应的原始Java系统资源类单元中,生成Java系统资源类单元;
类加载器单元405,用于加载生成的Java系统资源类单元。
在具体的实现中,Java类,包括资源类或其他类,其加载可以是由new关键字触发的。类加载器单元405在加载系统资源类定义时,自动加载添加了资源测量代码单元的上述Java系统资源类单元并替换原有的类单元定义。自定义的类加载器单元405可以通过JVM传入的类名判断是否需要加载自定义的资源类。
根据本发明装置实施例的一个具体示例,Java系统资源类单元包括线程调度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
根据本发明装置实施例的一个具体示例,Java系统资源类单元为线程调度器单元,系统资源使用量为CPU占用时间;
资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时,测量运行线程子类所占用的CPU时钟周期个数。
根据本发明装置实施例的一个具体示例,Java系统资源类单元为对象构造器单元,系统资源使用量为内存占用大小;
资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时,测量构造对象子类所占用的内存大小,作为内存占用大小。
根据本发明装置实施例的一个具体示例,Java系统资源类单元为文件读写器单元,系统资源使用量为IO数据量大小:
资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行时,测量输入流子类读取的数据量大小,作为IO数据量大小;或者
在调用文件读写器单元加载输出流子类运行时,测量输出流子类写入的数据量大小,作为IO数据量大小。
根据本发明装置实施例的一个具体示例,该装置还包括:
Java应用容器单元,用于在调用Java应用访问请求所需要的Java系统资源类单元之前,利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,对象单元包含资源测量代码单元;
应用业务逻辑单元,还用于响应于Java应用访问请求,从测量系统资源类的对象单元中选择所需要的对象单元;利用所选择的对象单元的定义创建Java应用访问请求所需要的Java系统资源类单元。
根据本发明装置实施例的一个具体示例,该装置还包括:
上下文信息管理单元406,用于将用户身份信息写入与用户身份信息向对应的用户上下文信息中;
资源测量代码单元403从用户上下文信息中获得用户身份信息,以将系统资源使用量记录在与用户身份信息相对应的计数信息中。
参见图5所示,图5示出本发明所提供的在Java应用中测量用户资源使用量的装置一种实施例的系统架构示意图。图5所示的实施例可以通过Java虚拟机(JVM)来实现,通过代码注入机制为各个Java系统资源类动态注入用户资源测量代码,当Java应用程序调用了注入了测量代码的Java资源类时,测量代码将自动记录用户对当前资源的实际使用量。
资源测量代码注入的过程:
JVM类加载器通过资源类转换器单元将资源测量代码注入到各种Java系统资源类中(1.1-1.2),如线程调度器单元、对象构造器单元、文件读写器单元等等,然后类加载器单元在应用运行时动态加载注入了资源测量代码的资源类字节码(1.3)。
用户使用的系统资源的测量过程:
示例性地,用户B向应用发起应用访问请求(2.1),应用服务入口单元接收到用户的应用访问请求,识别用户身份信息,将用户B的身份标识、会话标识、会话开始时间等信息写入用户上下文信息对应的存储模块,可以是与用户绑定的线程静态结构体中(2.2)。然后调用应用业务逻辑单元处理用户的应用访问请求(2.3),应用业务逻辑单元在执行时会调用各种Java系统资源类进行相应的系统资源操作(2.4),如执行线程、创建对象、读写文件等,从而触发注入到系统资源类单元中的资源测量代码,资源测量代码单元获取用户身份信息(2.5),测量出用户B对相应系统资源的实际使用量,然后将资源使用量更新到用户B的对应资源计数信息中(2.6),计数信息可以是针对各种资源的计数器。
至此,已经详细描述了根据本发明的一种在多用户Java应用中测量用户资源使用量的方法与装置。为了避免遮蔽本发明的构思,没有描述本领域所公知的一些细节。本领域技术人员根据上面的描述,完全可以明白如何实施这里公开的技术方案。
本说明书中各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似的部分相互参见即可。对于在多用户Java应用中测量用户资源使用量的装置实施例而言,由于其与方法实施例基本对应,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
可能以许多方式来实现本发明的在多用户Java应用中测量用户资源使用量的方法与装置。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本发明的在多用户Java应用中测量用户资源使用量的方法与装置。用于所述方法的步骤的上述顺序仅是为了进行说明,本发明的方法的步骤不限于以上具体描述的顺序,除非以其它方式特别说明。此外,在一些实施例中,还可将本发明实施为记录在记录介质中的程序,这些程序包括用于实现根据本发明的方法的机器可读指令。因而,本发明还覆盖存储用于执行根据本发明的方法的程序的记录介质。
虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技术人员应该理解,可在不脱离本发明的范围和精神的情况下,对以上实施例进行修改。本发明的范围由所附权利要求来限定。
Claims (18)
1.一种在Java应用中测量用户资源使用量的方法,其特征在于,所述方法包括:
响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述用户身份信息;
在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源测量代码单元;
所述资源测量代码单元在所述Java系统资源类单元被调用的过程中,测量调用所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
2.根据权利要求1所述的方法,其特征在于,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述方法还包括:
根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类单元;
识别是否已经加载所述Java系统资源类单元;
若已经加载所述Java系统资源类单元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作;否则,将所述资源测量代码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元,并加载生成的所述Java系统资源类单元,执行所述调用所述Java应用访问请求所需要的Java系统资源类单元的操作。
3.根据权利要求2所述的方法,其特征在于,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
4.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为CPU占用时间;
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
5.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内存占用大小;
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大小,作为所述内存占用大小。
6.根据权利要求3所述的方法,其特征在于,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为IO数据量大小:
所述测量调用所述Java系统资源类单元占用的系统资源使用量,具体包括:
在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据量大小,作为所述IO数据量大小;或者
在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述IO数据量大小。
7.根据权利要求1所述的方法,其特征在于,在调用所述Java应用访问请求所需要的Java系统资源类单元之前,所述方法还包括:
利用Java应用容器单元的对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述资源测量代码单元;
响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需要的对象单元;
利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资源类单元。
8.根据权利要求1至7任意一项所述的方法,其特征在于,所述方法还包括:
将所述用户身份信息写入与所述用户身份信息相对应的用户上下文信息中;
所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
9.根据权利要求1所述的方法,其特征在于,所述用户身份信息,为所述用户所属的租户标识;
所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
10.一种在Java应用中测量用户资源使用量的装置,其特征在于,所述装置包括:
应用服务入口单元,用于响应于接收到用户发起的Java应用访问请求,从所述应用访问请求中,识别所述用户身份信息;
应用业务逻辑单元,用于根据业务逻辑处理所述Java应用访问请求,在根据业务逻辑处理所述Java应用访问请求的过程中,调用所述Java应用访问请求所需要的Java系统资源类单元,其中,Java系统资源类单元包含与所述Java系统资源类单元相对应的资源测量代码单元;
资源测量代码单元,用于在所述Java系统资源类单元被调用的过程中,测量调用所述Java系统资源类单元占用的系统资源使用量,并将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
11.根据权利要求10所述的装置,其特征在于,所述应用业务逻辑单元,还用于在调用所述Java应用访问请求所需要的Java系统资源类单元之前,根据应用业务逻辑,分析获得所述Java应用访问请求所需要的Java系统资源类单元;识别是否已经加载所述Java系统资源类单元;响应于已经加载所述Java系统资源类单元,调用所述Java应用访问请求所需要的Java系统资源类单元的操作;
资源类转换器单元,用于响应于未加载所述Java系统资源类单元,将所述资源测量代码单元注入到对应的原始Java系统资源类单元中,生成所述Java系统资源类单元;
类加载器单元,用于加载生成的所述Java系统资源类单元。
12.根据权利要求11所述的装置,其特征在于,所述Java系统资源类单元包括线程调度器单元、对象构造器单元、文件读写器单元中的至少一种;相应地,所述资源测量代码单元测量的系统资源使用量分别为CPU占用时间、内存占用大小、IO数据量大小中的至少一种。
13.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为线程调度器单元,所述系统资源使用量为CPU占用时间;
所述资源测量代码单元,具体用于在调用线程调度器单元加载线程子类运行时,测量运行所述线程子类所占用的CPU时钟周期个数,作为所述CPU占用时间。
14.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为对象构造器单元,所述系统资源使用量为内存占用大小;
所述资源测量代码单元,具体用于在调用对象构造器单元构造对象子类运行时,测量所述对象子类所占用的内存大小,作为所述内存占用大小。
15.根据权利要求12所述的装置,其特征在于,所述Java系统资源类单元为文件读写器单元,所述系统资源使用量为IO数据量大小:
所述资源测量代码单元,具体用于在调用文件读写器单元加载输入流子类运行时,测量所述输入流子类读取的数据量大小,作为所述IO数据量大小;或者在调用文件读写器单元加载输出流子类运行时,测量所述输出流子类写入的数据量大小,作为所述IO数据量大小。
16.根据权利要求10所述的装置,其特征在于,所述装置还包括:
Java应用容器单元,用于在调用所述Java应用访问请求所需要的Java系统资源类单元之前,利用对象工厂单元创建测量系统资源类的对象单元,所述对象单元包含所述资源测量代码单元;
所述应用业务逻辑单元,还用于响应于所述Java应用访问请求,从所述测量系统资源类的对象单元中选择所需要的对象单元;利用所选择的对象单元的定义创建所述Java应用访问请求所需要的Java系统资源类单元。
17.根据权利要求10至16任意一项所述的装置,其特征在于,所述装置还包括:
上下文信息管理单元,用于将所述用户身份信息写入与所述用户身份信息向对应的用户上下文信息中;
所述资源测量代码单元从所述用户上下文信息中获得所述用户身份信息,以将所述系统资源使用量记录在与所述用户身份信息相对应的计数信息中。
18.根据权利要求10所述的装置,其特征在于,所述用户身份信息为所述用户所属的租户标识;
所述用户身份信息相对应的计数信息为所述租户标识所对应的计数信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310170698.7A CN104142817B (zh) | 2013-05-10 | 2013-05-10 | 在Java应用中测量用户资源使用量的方法与装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310170698.7A CN104142817B (zh) | 2013-05-10 | 2013-05-10 | 在Java应用中测量用户资源使用量的方法与装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104142817A CN104142817A (zh) | 2014-11-12 |
CN104142817B true CN104142817B (zh) | 2017-08-22 |
Family
ID=51852001
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310170698.7A Active CN104142817B (zh) | 2013-05-10 | 2013-05-10 | 在Java应用中测量用户资源使用量的方法与装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104142817B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105988919B (zh) * | 2015-03-02 | 2018-12-25 | 阿里巴巴集团控股有限公司 | Java型web容器内存使用量检测方法及相关装置 |
CN105260252B (zh) * | 2015-10-15 | 2018-09-14 | 深圳中兴力维技术有限公司 | 在网页上实现java系统控制台的输入/输出的系统、装置和方法 |
CN110297744A (zh) * | 2018-03-23 | 2019-10-01 | 优信拍(北京)信息科技有限公司 | 一种app应用统计时间设置方法及统计方法 |
CN112559292A (zh) * | 2020-12-18 | 2021-03-26 | 北京北方华创微电子装备有限公司 | 设备应用监控方法、半导体工艺设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1662901A (zh) * | 2002-06-25 | 2005-08-31 | 国际商业机器公司 | 用于在分布式环境中监视应用性能的方法和系统 |
CN1989488A (zh) * | 2004-05-20 | 2007-06-27 | Sap股份公司 | 运行时系统的鲁棒共享 |
CN1988549A (zh) * | 2005-12-22 | 2007-06-27 | 国际商业机器公司 | 生成用于应用会话的资源使用简档的方法和系统 |
CN101339535A (zh) * | 2008-08-21 | 2009-01-07 | 金蝶软件(中国)有限公司 | 一种对应用程序进行性能监控的方法及装置 |
CN101515248A (zh) * | 2008-02-21 | 2009-08-26 | 国际商业机器公司 | 面向对象程序的跟踪方法和系统 |
CN101639770A (zh) * | 2008-07-30 | 2010-02-03 | 国际商业机器公司 | 用于在jvm中支持多租户隔离/多租户定制的系统和方法 |
CN101980175A (zh) * | 2010-10-22 | 2011-02-23 | 中国科学院软件研究所 | 基于OSGi的软件构件监测方法与系统 |
CN102033804A (zh) * | 2009-09-29 | 2011-04-27 | 国际商业机器公司 | 辅助内存分析的方法和系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040123279A1 (en) * | 2002-12-18 | 2004-06-24 | International Business Machines Corporation | Method and system for auto-instrumenting java applications through probe injection |
US8429187B2 (en) * | 2011-03-21 | 2013-04-23 | Amazon Technologies, Inc. | Method and system for dynamically tagging metrics data |
-
2013
- 2013-05-10 CN CN201310170698.7A patent/CN104142817B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1662901A (zh) * | 2002-06-25 | 2005-08-31 | 国际商业机器公司 | 用于在分布式环境中监视应用性能的方法和系统 |
CN1989488A (zh) * | 2004-05-20 | 2007-06-27 | Sap股份公司 | 运行时系统的鲁棒共享 |
CN1988549A (zh) * | 2005-12-22 | 2007-06-27 | 国际商业机器公司 | 生成用于应用会话的资源使用简档的方法和系统 |
CN101515248A (zh) * | 2008-02-21 | 2009-08-26 | 国际商业机器公司 | 面向对象程序的跟踪方法和系统 |
CN101639770A (zh) * | 2008-07-30 | 2010-02-03 | 国际商业机器公司 | 用于在jvm中支持多租户隔离/多租户定制的系统和方法 |
CN101339535A (zh) * | 2008-08-21 | 2009-01-07 | 金蝶软件(中国)有限公司 | 一种对应用程序进行性能监控的方法及装置 |
CN102033804A (zh) * | 2009-09-29 | 2011-04-27 | 国际商业机器公司 | 辅助内存分析的方法和系统 |
CN101980175A (zh) * | 2010-10-22 | 2011-02-23 | 中国科学院软件研究所 | 基于OSGi的软件构件监测方法与系统 |
Non-Patent Citations (1)
Title |
---|
Program transformations for portable CPU accounting and control in Java;Jarle Hulaas等;《Proceedings of the 2004 ACM SIGPLAN symposium on Partial evaluation and semantics-based program manipulation》;20040825;第169-177页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104142817A (zh) | 2014-11-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Sakamoto et al. | Bytecode transformation for portable thread migration in Java | |
Noureddine et al. | Monitoring energy hotspots in software: Energy profiling of software code | |
Espadas et al. | A tenant-based resource allocation model for scaling Software-as-a-Service applications over cloud computing infrastructures | |
Eichenberger et al. | OMPT: An OpenMP tools application programming interface for performance analysis | |
US8527960B2 (en) | Combining method parameter traces with other traces | |
Huber et al. | Performance modeling in industry: a case study on storage virtualization | |
CN105049218B (zh) | PhiCloud云计费方法及系统 | |
Schoeberl et al. | The embedded Java benchmark suite JemBench | |
CN104142817B (zh) | 在Java应用中测量用户资源使用量的方法与装置 | |
CN106250310B (zh) | 一种测试用例生成方法及装置 | |
CN102955721A (zh) | 一种测试用的压力生成方法及装置 | |
US10725893B2 (en) | System and method for determination of code coverage for software applications in a network environment | |
Han et al. | Refining microservices placement employing workload profiling over multiple kubernetes clusters | |
Mohanty et al. | A model based prioritization technique for component based software retesting using UML state chart diagram | |
Rosales et al. | Fjprof: Profiling fork/join applications on the java virtual machine | |
CN103324600B (zh) | 运行计算模块的系统及其运行方法 | |
CN110347448B (zh) | 一种构造终端应用行为的运行时模型的方法 | |
Jangid | Real time cloud computing | |
Lin et al. | Bbserverless: A bursty traffic benchmark for serverless | |
Gupta et al. | Kinship: efficient resource management for performance and functionally asymmetric platforms | |
CN111382044A (zh) | 性能瓶颈的定位方法、定位装置、电子设备及存储介质 | |
Wang | Thin serverless functions with graalvm native image | |
JP2012221034A (ja) | メモリ管理装置、メモリ管理方法及びメモリ管理プログラム | |
CN108418730A (zh) | 网络流量测试方法、装置、设备以及计算机可读存储介质 | |
Meyerhöfer et al. | Estimating non-functional properties of component-based software based on resource consumption |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |