一种Java虚拟机管理方法及装置与流程

文档序号:26003778发布日期:2021-07-23 21:21阅读:123来源:国知局
一种Java虚拟机管理方法及装置与流程

本发明实施例涉及金融科技(fintech)领域,尤其涉及一种java虚拟机管理方法及装置。



背景技术:

随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。

虚拟机(virtualmachine)是指通过软件模拟的具有完整硬件系统功能,运行在一个完全隔离环境中的完整计算机系统,在实体计算机中能够完成的工作在虚拟机中都能够实现。即,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。基于虚拟机的该特点,开始逐渐将虚拟机应用于金融科技领域,以便为金融企业或金融企业的客户提供更为便利的服务。

随着虚拟机的不断应用,尤其在金融科技领域,为了确保金融服务质量,需要对虚拟机中出现的程序异常问题进行定位,并对虚拟机的内存进行管理。然而,现阶段,针对虚拟机的监控,全链路分析工具(即pinpoint)只能采集到cpu使用量、堆内存等进程级监控参数,并对进程级监控参数进行展示,无法对虚拟机中出现的程序异常问题进行精准定位,且无法对虚拟机进行有效管理。

综上,目前亟需一种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虚拟机运行时的参数信息,并基于该更细粒度的参数信息在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虚拟机对所述异常目标进行操作。

可选地,所述获取单元具体用于:

通过所述java虚拟机的扩展接口对所述java虚拟机中的类方法进行重构;

通过所述java虚拟机所在的应用服务器上部署的代理组件进行线程级参数信息的采集。

可选地,所述获取单元具体用于:

所述进程级参数信息至少包括以下一项:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池、直接内存;所述线程级参数信息至少包括以下至少一项:线程的资源占用情况、类的资源占用情况、方法的资源占用情况、对象的资源占用情况。

可选地,所述获取单元具体用于:

通过收集组件,经所述java虚拟机所在的应用服务器的代理组件,获取所述线程级参数信息和所述进程级参数信息;

所述处理单元具体用于:

通过分析组件,对所述进程级参数信息和所述线程级参数信息进行分析,确定所述java虚拟机中是否存在异常目标;

所述处理单元具体用于:

通过所述收集组件,向所述java虚拟机发送控制指令。

可选地,所述处理单元具体用于:

将所述收集组件收集的各进程级参数信息和各线程级参数信息,按照应用服务器的不同,划分为多个数据块;

按照分布式并行计算的方式,确定每个数据块中是否存在异常目标。

可选地,所述处理单元具体用于:

通过主节点,调用至少一个第一工作节点和至少一个第二工作节点;

针对每个第一工作节点,所述第一工作节点读取本地的数据块并对所述本地的数据块进行计算,得到结果数据;

所述主节点在确定各第一工作节点计算完成后,通过所述至少一个第二工作节点将所述各第一工作节点计算得到的结果数据汇总为结果文件;所述结果文件用于所述分析组件将所述结果文件中每个参数与该参数对应的预警阈值进行比对,确定所述参数是否存在异常。

可选地,所述处理单元具体用于:

基于绑定机制,建立所述代理组件与所述java虚拟机之间的通信通道;

所述虚拟机服务器通过所述收集组件向所述代理组件发送所述控制指令;所述代理组件用于通过所述通信通道,向所述java虚拟机发送所述控制指令。

可选地,所述处理单元具体用于:

通过调用通信线程,与所述java虚拟机建立连接,并在连接建立成功后向所述java虚拟机中的异常目标发送所述控制指令;

所述处理单元还用于:

在向所述java虚拟机发送控制指令之前,通过界面组件在监控到分析组件将处理后的各进程级参数信息、各线程级参数信息存储至数据库时,从所述数据库获取所述处理后的各进程级参数信息、各线程级参数信息进行展示,并展示所述异常目标的告警信息。

第三方面,本发明实施例提供一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任意所述的java虚拟机管理方法。

第四方面,本发明实施例提供一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述第一方面任意所述的java虚拟机管理方法。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种java虚拟机管理系统架构的示意图;

图2为本发明实施例提供的一种java虚拟机管理方法的流程示意图;

图3为本发明实施例提供的另一种java虚拟机管理方法的流程示意图;

图4为本发明实施例提供的一种java虚拟机的内存区域结构示意图;

图5为本发明实施例提供的一种java虚拟机管理装置的结构示意图;

图6为本发明实施例提供的一种计算设备的结构示意图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

下面首先对本发明实施例中涉及的部分用语进行解释说明,以便于本领域技术人员进行理解。

(1)jvm:是javavirtualmachine(java虚拟机)的缩写,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

(2)oom:outofmemory,内存用完的意思,一般导致内存用完存在两种情况,一种情况是分配的少了,比如虚拟机本身可使用的内存太少;另一种情况是应用用的太多,并且用完没释放,浪费了,此时就会造成内存泄露或者内存溢出。

(3)内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。

(4)内存溢出:申请的内存超出了jvm能提供的内存大小。

(5)垃圾回收:垃圾收集器会按照固定的时间间隔,周期性的找出不再继续使用的变量(即生命周期结束的变量,比如局部变量),然后释放其占用的内存。比如,在不需要字符串、对象的时候,需要释放其所占用的内存,否则将会消耗完系统中所有可用的内存,造成系统崩溃。

(6)hbase:是一个分布式的、面向列的开源数据库。该hbase不同于一般的关系数据库,它是一个适合于非结构化数据存储(即基于列的而不是基于行的模式进行存储)的数据库。

(7)jvmti:是jvmtoolinterface(java虚拟机的工具接口)的缩写,是指是java虚拟机暴露出来的一些供用户扩展的接口集合。

(8)heapdump:是一个二进制文件,它保存了某一时刻java虚拟机堆中对象使用情况。

如上介绍了本发明实施例中涉及的部分用语,下面对本发明实施例涉及的技术特征进行介绍。

为了便于理解本发明实施例,首先以图1中示出的系统结构为例说明适用于本发明实施例的java虚拟机管理系统架构。该java虚拟机管理系统架构可以应用于参与java虚拟机的内存管理等。如图1所示,该java虚拟机管理系统架构可以包括管理服务平台100、至少一个虚拟机代理组件(比如虚拟机代理组件201、虚拟机代理组件202和虚拟机代理组件203等)和数据库300。其中,每个虚拟机代理组件分别与管理服务平台100进行连接,比如可以通过有线方式连接,或者通过无线方式连接,具体不作限定。

其中,管理服务平台100可以包括监控展示组件101、数据收集组件102和数据分析组件103。

监控展示组件101用于展示java虚拟机的监控参数,并对java虚拟机的监控参数中的异常数据进行告警;同时用户也可以在监控展示组件(也可以称为界面组件)进行监控参数阈值的自定义设置;

数据收集组件102用于接收虚拟机代理组件上报的java虚拟机的监控参数已存入数据库300的通知消息,并将该通知消息发送给数据分析组件103;或者,数据收集组件(也可以称为收集组件)102也可用于收集虚拟机代理组件上报的java虚拟机的监控参数,并将收集来的java虚拟机的监控参数发送给数据分析组件103进行分析处理。同时,数据收集组件102也会接收数据分析组件103针对java虚拟机中出现的异常信息下发的控制指令,并将该控制指令下发给对应的虚拟机代理组件;

数据分析组件103用于在接收到数据收集组件102发送的java虚拟机的监控参数已存入数据库300的通知消息时,从数据库300读取java虚拟机的监控参数,并对java虚拟机的监控参数进行分析处理。若确定java虚拟机的监控参数中存在异常数据,则确定出异常数据对应的虚拟机代理组件,并通过数据收集组件102向对应的虚拟机代理组件下发控制指令,该控制指令用于虚拟机代理组件针对java虚拟机中的异常数据所涉及的异常目标进行相应处理。比如,针对java虚拟机中出现的方法占用内存过高问题,数据分析组件(也可称为分析组件)103向数据收集组件102下发内存释放回收指令,数据收集组件102将该内存释放回收指令下发给对应的虚拟机代理组件,以便虚拟机代理组件针对java虚拟机中的方法占用内存进行垃圾回收操作,如此,可以及时地释放回收异常数据,从而可以避免内存泄露或内存溢出。同时数据分析组件103也会通过数据收集组件将异常信息上报给监控展示组件101,以便监控展示组件101基于该异常数据进行告警。

针对每个虚拟机代理组件,该虚拟机代理组件是部署在应用服务器上,用于采集应用服务器中java虚拟机的监控参数,并将java虚拟机的监控参数上报给管理服务平台100,同时会将java虚拟机的监控参数存储到数据库300。此外,虚拟机代理组件可以接受管理服务平台100下发的控制指令,以管理控制java虚拟机,比如可以调整java虚拟机的参数,或者可以捕捉java虚拟机中的异常线程,或者可以捕捉java虚拟机中的异常代码等。具体地,数据分析组件103针对java虚拟机中出现的异常信息,可以向数据收集组件102下发针对该异常信息的控制指令,再由数据收集组件102将该控制指令下发给对应的虚拟机代理组件,然后,虚拟机代理组件再下发给对应的java虚拟机,以便对java虚拟机的异常信息所涉及的异常目标进行相应处理。需要说明的是,虚拟机代理组件可以采集应用服务器中一个或多个java虚拟机的监控参数,本发明实施例对此并不作限定。

数据库300,比如数据库300可以为hbase,可以用于存储虚拟机代理组件采集到的java虚拟机的监控参数,并可以用于存储数据分析组件103处理后的监控参数。

需要说明的是,上述图1所示的结构仅是一种示例,本发明实施例对此不做限定。

基于上述描述,图2示例性的示出了本发明实施例提供的一种java虚拟机管理方法的流程,该流程可以由java虚拟机管理装置执行。

如图2所示,该流程具体包括:

步骤201,获取java虚拟机运行中的线程级参数信息和进程级参数信息。

步骤202,对所述进程级参数信息和所述线程级参数信息进行分析,确定所述java虚拟机中是否存在异常目标。

步骤203,若确定所述java虚拟机中存在异常目标,则向所述java虚拟机发送控制指令。

上述步骤201中,java虚拟机所在的应用服务器的代理组件通过java虚拟机提供的接口,可以采集到java虚拟机运行中的线程级参数信息和进程级参数信息。具体地,由于现有技术中的方案只能采集cpu使用量、堆内存等进程级监控参数,并不能采集到线程级监控参数,因此本方案通过对java虚拟机中的类方法进行重构,即可实现对线程级监控参数的采集。即,首先通过java虚拟机的扩展接口对java虚拟机中的类方法进行重构,可以得到一个新接口(该新接口中包含重构后的类方法),再通过该新接口就可以从底层采集到更全面、更精细的java虚拟机运行时的参数信息,即线程级参数信息和进程级参数信息。其中,进程级参数信息可以包括程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池、直接内存等;线程级参数信息可以包括线程的资源占用情况、类的资源占用情况、方法的资源占用情况、对象的资源占用情况等。此外,针对获取线程级参数信息和进程级参数信息,本发明实施例的一种实现方式是:虚拟机服务器(即管理服务平台)通过收集组件,经java虚拟机所在的应用服务器的代理组件,该代理组件通过新接口即可及时地采集java虚拟机中的线程级参数信息和进程级参数信息。

示例性地,通过java虚拟机的扩展接口对java虚拟机类库中的类方法进行重构,比如,对类库tools.jar中的tool类方法进行自定义要采集的参数和内容,得到一个mtool类方法,即可实现根据自己的需求采集自己想要的数据。如此,代理组件通过重构后的扩展接口即可采集java虚拟机中的线程级参数信息和进程级参数信息。

上述步骤202和步骤203中,虚拟机服务器通过分析组件,对进程级参数信息和线程级参数信息进行分析,确定java虚拟机中是否存在异常目标。具体地,将收集组件收集的各进程级参数信息和各线程级参数信息,按照应用服务器的不同,划分为多个数据块,并按照分布式并行计算的方式,确定每个数据块中是否存在异常目标。具体地,在确定每个数据块中是否存在异常目标时,具体实施过程为:分析组件通过主节点,调用至少一个第一工作节点和至少一个第二工作节点。针对每个第一工作节点,第一工作节点读取本地或本机架的数据块并对本地或本机架的数据块进行计算,得到结果数据。然后,主节点在确定各第一工作节点计算完成后,通过至少一个第二工作节点将各第一工作节点计算得到的结果数据汇总为结果文件。其中,结果文件用于分析组件将结果文件中每个参数与该参数对应的预警阈值进行比对,确定参数是否存在异常。如此,通过按照分布式并行计算的方式,对各数据块进行并行处理,可以及时准确地确定每个数据块中是否存在异常目标,如此,可以将异常目标的相关信息及时的传输给监控展示组件进行告警展示,并可以及时地针对java虚拟机中的异常目标进行精准的处理,以便避免java应用程序挂起而不能提供正常的服务。若确定任一数据块中均未存在异常目标,则通知界面组件各进程级参数信息和各线程级参数信息已处理完成的消息,以便界面组件可以及时地进行展示处理后的各进程级参数信息和各线程级参数信息。若确定某一数据块中存在异常目标,则需要针对异常目标,首先确定出该异常目标所对应的代理组件,再通过收集组件,向对应的代理组件下发控制指令,然后,代理组件及时地向对应的java虚拟机发送控制指令,以便能够针对异常目标进行及时有效地处理。具体地,基于绑定机制,建立代理组件与java虚拟机之间的通信通道,通过收集组件向代理组件发送控制指令。基于此,通过绑定机制,可以实现代理组件与java虚拟机之间的直接通信,从而可以在收集组件向代理组件发送控制指令后,使得代理组件能够及时有效地将该控制指令下发给java虚拟机。其中,代理组件用于通过通信通道,向java虚拟机发送控制指令,即代理组件通过调用通信线程(比如线程attachoperation和线程attachlistener),与java虚拟机建立连接,并在连接建立成功后向java虚拟机中的异常目标发送控制指令;控制指令用于指示java虚拟机对异常目标进行操作。

示例性地,若确定某一数据块中存在异常目标,比如对象占用内存异常等,则需要针对异常目标,首先确定出该异常目标所对应的代理组件,再基于attach机制,建立代理组件与java虚拟机之间的通信通道,然后通过收集组件,向对应的代理组件下发控制指令,最后,代理组件及时地向对应的java虚拟机发送内存释放回收指令,以便及时地针对java虚拟机中的对象占用内存进行释放回收操作,从而可以避免java应用程序挂起而不能提供正常的服务。

此外,在分析组件对各进程级参数信息和各线程级参数信息进行处理后,界面组件在监控到分析组件将处理后的各进程级参数信息、各线程级参数信息存储至数据库时,从数据库获取处理后的各进程级参数信息、各线程级参数信息进行展示。若分析组件在对各进程级参数信息和各线程级参数信息进行处理后,确定存在异常目标,则也会将该异常目标的相关信息发送给界面组件,以便界面组件可以及时有效地基于该异常目标的相关信息对异常目标进行告警,并展示异常目标的告警信息。如此,通过界面组件,可以直观清晰地展示java虚拟机的线程级参数信息和进程级参数信息,以及展示异常目标的告警信息,从而可以便于用户能够更直观清晰地了解每个参数的当前状态。

基于此,下面结合图3,对本发明实施例中java虚拟机管理方法的实施过程进行具体描述。其中,图3为本发明实施例提供的另一种java虚拟机管理方法的流程示意图。

step1:虚拟机代理组件采集java应用程序中java虚拟机的监控参数。

虚拟机代理组件通过对java虚拟机(jvm)的扩展接口中的类方法进行重构,并基于重构后的方法从java应用程序的底层采集java虚拟机的监控参数。其中,虚拟机代理组件部署在应用服务器上,虚拟机代理组件启动后即可自动采集应用服务器上面运行的java程序信息(即java虚拟机的监控参数)。该java程序信息可以包括程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池、直接内存等参数配置信息和使用情况,以及类占用内存数据、方法占用内存数据、对象占用内存数据、多线程消耗内存情况及数量、各个请求的数量、响应时间、资源消耗等。

具体地,虚拟机代理组件(jvmagent)通过拓展tools.jar和sa-jdi.jar中的类和方法以实现自定义配置类方法,并基于自定义配置的类方法直接从底层采集java虚拟机的监控参数,并将java虚拟机的监控参数存入数据库,同时将java虚拟机的监控参数上报给数据收集组件(collector)。

示例性地,虚拟机代理组件通过方法重载、类继承tools.jar和sa-jdi.jar,调用jvmti扩展接口进行重新开发,生成新的方法,并根据该新的方法就可以采集到更全面、更精细的监控参数,比如,对sa-jdi.jar中的tool类方法进行重构,得到一个mytool类方法,基于该mytool类方法就可以采集到更全面、更精细的监控参数,而不受java虚拟机已封装工具(比如jstat,jmap等)和接口的限制。如此,就可以实现用户根据自己的需要直接采集自己需求的数据。其中,jstat,jmap等java虚拟机的封装工具采集的数据有限,不能满足用户的需求;jvmti还在java虚拟机内存管理、线程控制、方法和变量操作等方面提供了大量有价值的函数。

其中,tools.jar和sa-jdi.jar是java虚拟机监控最主要的两个类库,该两个类库中有很多可以直接使用的方法,它们相当于是对获取java虚拟机的监控参数的另一层封装,但是这些封装都仅仅是一次执行就结束。

此外,虚拟机代理组件可以对java应用程序中的java虚拟机进行以下监控操作,即:

a、通过实时监控heapdump(堆dump)中的线程内存消耗、类占用内存、方法占用内存以及对象占用内存等监控参数,查看是否存在垃圾收集器无法回收的对象存在。比如,存在死循环一直在创建新的对象、消耗内存资源的代码;正常消耗资源过高,捕捉待优化的代码。

b、监控java虚拟机栈和本地方法栈,得到线程使用情况、线程内存消耗情况等,来确定线程请求的栈深度是否大于java虚拟机所允许的最大深度,以及根据java虚拟机的栈内存动态扩容的大小,确定是否能正常申请到内存。

c、监控方法区和运行时常量池,确定是否有大量的类去填满了方法区等。

d、监控本机直接内存以及程序directbytebuffer(堆外内存)类调用情况。

step2:数据分析组件对java虚拟机的监控参数进行分析处理,确定监控参数中是否存在异常数据。

具体地,虚拟机代理组件会将java虚拟机的监控参数已存入数据库的通知消息上报给数据收集组件,然后,数据收集组件会将该通知消息发送给数据分析组件(analyzer),以便数据分析组件能够及时地对java虚拟机的监控参数进行分析处理。数据分析组件从数据库中获取各java虚拟机的监控参数,针对每个java虚拟机的监控参数,数据分析组件对该java虚拟机的监控参数进行分析,确定监控参数中是否存在异常数据,若是,则确定出异常数据对应的虚拟机代理组件,并通过数据收集组件向对应的虚拟机代理组件下发控制指令。然后,虚拟机代理组件向java虚拟机下发控制指令,以便对java虚拟机中异常数据所关联的异常目标进行相应处理。比如,数据分析组件在确定出异常数据时,确定出该异常数据对应的异常对象或异常线程,则会在程序出现oom前,通过数据收集组件向对应的虚拟机代理组件下发中断指令,然后,虚拟机代理组件向对应的java虚拟机下发中断指令,以便对该java虚拟机中的异常对象或异常线程进行中断处理。或者,数据分析组件在确定类占用内存数据超过类占用内存的预警阈值时,下发内存释放回收指令给类占用内存数据所对应的虚拟机代理组件,然后,虚拟机代理组件向对应的java虚拟机下发内存释放回收指令,以便对该java虚拟机中的类占用内存进行释放回收处理,如此,本发明实施例中的方案可以辅助java应用程序进行垃圾回收,以便释放java虚拟机中无法释放的垃圾对象,从而可以避免java虚拟机中出现内存泄露或内存溢出的情况。同时,可以防止java应用程序挂起而影响正常的业务交易(比如金融贷款交易、金融转账交易或金融支付交易等)。此外,数据分析组件也会通过数据收集组件将异常信息发送给监控展示组件,以便监控展示组件基于异常信息中的异常数据进行告警,比如,用户可以在监控展示组件中就可以直接看到异常的堆栈消耗、异常代码,相比现有技术中的全链路分析工具,更加直观清晰的展示更细粒度的监控参数。

需要说明的是,数据收集组件也可用于收集虚拟机代理组件上报的java虚拟机的监控参数,并将该java虚拟机的监控参数发送给数据分析组件进行分析处理。其中,数据收集组件可以实时地将收集来的java虚拟机的监控参数发送给数据分析组件进行分析处理,或者,也可以按照设定周期(比如每间隔30秒、每间隔1分钟或每间隔3分钟等)将收集来的java虚拟机的监控参数发送给数据分析组件进行分析处理,本发明实施例对此并不作限定。

进一步地,数据分析组件从数据库中读取各java虚拟机的监控参数,并对各java虚拟机的监控参数进行分析处理,确定各java虚拟机的监控参数是否存在异常数据。即,针对任一java虚拟机,将该java虚拟机的监控参数中每个数据都与该数据对应的预警阈值进行对比,确定该数据是否异常。具体地,可以通过分布式并行计算mapreduce,可以先将获取的监控参数拆分为各个数据块,再基于各个数据块分别与对应的预警阈值进行比对,确定出异常信息。然后将异常信息进行汇总输出。其中,通过分布式并行计算mapreduce确定出异常信息的具体实施过程可以为:

a、数据分析组件从数据库中读取各java虚拟机的监控参数,并按照应用服务器的类型,将各java虚拟机的监控参数归类为各自对应的应用服务器。再针对每个应用服务器,将该应用服务器所对应的监控参数划分为多个数据块,并确定出与多个数据块相对应的用户作业程序。比如,针对一个应用服务器,假设该应用服务器所对应的监控参数有20个,则可以将每5个参数一组,可以分为4组,该4组即相当于4个数据块。其中,每个数据块对应于一个计算任务,数据分析组件自动调度计算节点来处理相应的数据块,即,数据分析组件主要负责分配和调度计算节点(map节点或reduce节点),同时负责监控这些节点的执行状态,并负责map节点执行的同步控制。比如,针对192.168.1.11服务器上类loaded数、compiled数、s1c、oc等参数进行分析处理,并将这些参数与对应的设定的预警阈值进行比对,判断这些参数中是否存在异常参数。

b、数据分析组件启动一个负责调度的主节点(master),以及数据工作节点(worker),即,map节点和reduce节点。其中,主节点为作业程序寻找和配备可用的map节点,并将程序传送给map节点;同时也为作业程序寻找和配备可用的reduce节点,并将程序传送给reduce节点。

c、主节点启动每一个map节点执行程序,每个map节点尽可能读取本地或本机架的数据进行计算。其中,为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,如此即可实现代码向数据的迁移。若无法进行这种本地化数据处理,则寻找其他可用节点,并将数据通过网络传输给该节点(即数据向代码迁移),但尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。

d、每个map节点处理读取的数据块,并做一些数据整理工作,比如合并(combining)、分组(sorting)等,并将数据存储在本地机器上;同时通知主节点计算任务已完成的消息,并告知主节点针对数据块处理后的中间结果数据的存储位置在哪。其中,中间结果数据可以包括异常信息。

e、主节点等所有map节点计算完成后,开始启动reduce节点运行。reduce节点通过主节点所掌握的中间结果数据的存储位置信息,远程读取这些数据,并将这些数据汇总输出到一个结果文件,即可获得整个处理结果。然后,将整个处理结果存储到数据库中。

数据分析组件针对整个处理结果中的任一异常信息,确定出该异常信息所对应的虚拟机代理组件,并基于该异常信息向数据收集组件下发控制指令,然后,数据收集组件在接收到该控制指令后,向对应的虚拟机代理组件下发该控制指令,以使虚拟机代理组件对java虚拟机中的异常信息所涉及的异常目标进行控制处理。同时,数据分析组件也会将异常信息传输给数据收集组件,然后,数据收集组件将异常信息传输给监控展示组件,以便监控展示组件针对异常信息进行告警处理。

需要说明的是,为了实现虚拟机代理组件与java虚拟机的通信,本发明实施例通过调用jvmti接口及重新开发扩展的新接口,并通过java虚拟机的attach机制动态管理控制java应用程序。比如,对堆内存泄露控制、异常对象销毁、内存回收等操作进行动态管理,如此可以避免java应用程序异常挂起,并可以避免影响业务应用系统的可用性。同时,会将针对异常信息的处理结果反馈给数据收集组件,数据收集组件再反馈给监控展示组件,以便监控展示组件可以将异常信息的处理结果进行展示,从而可以使得用户及时的了解到异常信息的处理状态。

下面结合图4,对虚拟机代理组件与java虚拟机的通信实施过程进行描述。其中,图4为本发明实施例提供的一种java虚拟机的内存区域结构示意图。

a、数据收集组件向虚拟机代理组件下发控制指令。比如,下发的控制指令可以为类占用内存释放回收指令、方法占用内存释放回收指令、线程消耗内存释放回收指令或异常线程中断指令等。

b、虚拟机代理组件调用jvmti接口中的agent_onattach函数,启动attach线程,实现虚拟机代理组件与java虚拟机之间的直接通讯。

c、虚拟机代理组件启动attachoperation和attachlistener两个通信线程,并通过线程attachoperation和线程attachlistener,连接(attach)到对应的java虚拟机。然后,虚拟机代理组件在与java虚拟机进行连接后,可以向java虚拟机中的异常目标发送控制指令,以便对java虚拟机中的异常目标进行处理。比如,针对异常线程,可以向对应的java虚拟机发送中断指令,以便对java虚拟机中的异常线程进行中断处理,或者,针对类占用内存过高,可以向对应的java虚拟机发送内存释放回收指令,以便对java虚拟机中的类占用内存进行释放回收处理。

step3:监控展示组件对数据分析组件处理后的监控参数进行展示。

具体地,监控展示组件(webui)在监测到数据分析组件对java虚拟机的监控参数进行处理并存储到数据库时,可以从数据库中获取处理后的监控参数,并将处理后的监控参数进行展示,如此,可以便于用户直观的看到当前java虚拟机的使用情况(比如类、方法、对象占用内存大小或cpu使用情况)。比如,监控展示组件可以实时对数据分析组件的处理结果进行监测,或者可以按照设定周期(比如每间隔30秒、每间隔1分钟、或每间隔2分钟等)对数据分析组件的处理结果进行监测,本发明实施例对此并不作限定。

示例性地,数据收集组件在接收到某一java虚拟机的监控参数后,对该java虚拟机的监控参数进行简单归类处理,并将简单归类处理后的监控参数传输给监控展示组件。然后,监控展示组件对该监控参数进行展示,用户可以通过该监控展示组件能够直观清晰的查看java应用程序中java虚拟机的当前使用情况、应用性能瓶颈以及异常数据告警等。如此,可以便于日常生产问题分析,以使用户能够主动进行预防,同时可以便于实现更细粒度的监控参数的展示,并可以更加符合用户的实际需要,从而可以便于用户基于更细粒度的监控参数能够更精准地确定出java应用程序中程序出现异常的具体原因,并基于程序出现异常的具体原因,确定出优化策略,比如,对java虚拟机的配置进行优化或对程序代码进行优化等。

其中,用户也可以在监控展示组件中进行配置监控参数各数据的预警阈值,比如,配置heap(堆)、maxmetaspacesize(元空间内存最大值)、maxdirectmemorysiez(堆外内存最大值)等预警阈值。若某一数据超过预警阈值,则java虚拟机管理系统会基于该数据进行告警并自动分析该数据异常的具体原因,以便确定出消耗内存的对象、代码块等信息。

上述实施例表明,通过对java虚拟机中的类方法进行重构,可以得到一个新接口(该新接口中包含重构后的类方法),再基于该新接口可以从底层采集到更全面、更精细的java虚拟机运行时的参数信息,即线程级参数信息和进程级参数信息。基于此,就可以及时地对参数信息进行分析,以确定java虚拟机中是否存在异常目标,并在确定java虚拟机中出现异常目标时,能够更及时更精准的定位到出现异常目标的具体原因。然后,在确定出现异常目标的具体原因后,该方案可以主动对java虚拟机进行控制管理,以便及时地针对java虚拟机中的异常目标进行相应处理。即,可以主动向java虚拟机发送控制指令,以便基于控制指令自动调整java虚拟机中的异常目标,从而可以避免java应用程序挂起而不能提供正常的服务,并可以实现对java虚拟机进行有效管理(比如对java虚拟机的内存进行有效管理),进而可以解决现有技术中存在无法对虚拟机进行有效管理的问题。

基于相同的技术构思,图5示例性的示出了本发明实施例提供的一种java虚拟机管理装置,该装置可以执行java虚拟机管理方法的流程。

如图5所示,该装置包括:

获取单元501,用于获取java虚拟机运行中的线程级参数信息和进程级参数信息;所述线程级参数信息是通过对所述java虚拟机中的类方法进行重构后采集的;

处理单元502,用于对所述进程级参数信息和所述线程级参数信息进行分析,确定所述java虚拟机中是否存在异常目标;若是,则向所述java虚拟机发送控制指令;所述控制指令用于指示所述java虚拟机对所述异常目标进行操作。

可选地,所述获取单元501具体用于:

通过所述java虚拟机的扩展接口对所述java虚拟机中的类方法进行重构;

通过所述java虚拟机所在的应用服务器上部署的代理组件进行线程级参数信息的采集。

可选地,所述获取单元501具体用于:

所述进程级参数信息至少包括以下一项:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池、直接内存;所述线程级参数信息至少包括以下至少一项:线程的资源占用情况、类的资源占用情况、方法的资源占用情况、对象的资源占用情况。

可选地,所述获取单元501具体用于:

通过收集组件,经所述java虚拟机所在的应用服务器的代理组件,获取所述线程级参数信息和所述进程级参数信息;

所述处理单元502具体用于:

通过分析组件,对所述进程级参数信息和所述线程级参数信息进行分析,确定所述java虚拟机中是否存在异常目标;

所述处理单元502具体用于:

通过所述收集组件,向所述java虚拟机发送控制指令。

可选地,所述处理单元502具体用于:

将所述收集组件收集的各进程级参数信息和各线程级参数信息,按照应用服务器的不同,划分为多个数据块;

按照分布式并行计算的方式,确定每个数据块中是否存在异常目标。

可选地,所述处理单元502具体用于:

通过主节点,调用至少一个第一工作节点和至少一个第二工作节点;

针对每个第一工作节点,所述第一工作节点读取本地的数据块并对所述本地的数据块进行计算,得到结果数据;

所述主节点在确定各第一工作节点计算完成后,通过所述至少一个第二工作节点将所述各第一工作节点计算得到的结果数据汇总为结果文件;所述结果文件用于所述分析组件将所述结果文件中每个参数与该参数对应的预警阈值进行比对,确定所述参数是否存在异常。

可选地,所述处理单元502具体用于:

基于绑定机制,建立所述代理组件与所述java虚拟机之间的通信通道;

所述虚拟机服务器通过所述收集组件向所述代理组件发送所述控制指令;所述代理组件用于通过所述通信通道,向所述java虚拟机发送所述控制指令。

可选地,所述处理单元502具体用于:

通过调用通信线程,与所述java虚拟机建立连接,并在连接建立成功后向所述java虚拟机中的异常目标发送所述控制指令;

所述处理单元502还用于:

在向所述java虚拟机发送控制指令之前,通过界面组件在监控到分析组件将处理后的各进程级参数信息、各线程级参数信息存储至数据库时,从所述数据库获取所述处理后的各进程级参数信息、各线程级参数信息进行展示,并展示所述异常目标的告警信息。

基于相同的技术构思,本发明实施例还提供了一种计算设备,如图6所示,包括至少一个处理器601,以及与至少一个处理器连接的存储器602,本发明实施例中不限定处理器601与存储器602之间的具体连接介质,图6中处理器601和存储器602之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。

在本发明实施例中,存储器602存储有可被至少一个处理器601执行的指令,至少一个处理器601通过执行存储器602存储的指令,可以执行前述的java虚拟机管理方法中所包括的步骤。

其中,处理器601是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器602内的指令以及调用存储在存储器602内的数据,从而实现数据处理。可选的,处理器601可包括一个或多个处理单元,处理器601可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器601中。在一些实施例中,处理器601和存储器602可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。

处理器601可以是通用处理器,例如中央处理器(cpu)、数字信号处理器、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合java虚拟机管理方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

存储器602作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器602可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(randomaccessmemory,ram)、静态随机访问存储器(staticrandomaccessmemory,sram)、可编程只读存储器(programmablereadonlymemory,prom)、只读存储器(readonlymemory,rom)、带电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁性存储器、磁盘、光盘等等。存储器602是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器602还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。

基于相同的技术构思,本发明实施例还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述java虚拟机管理方法的步骤。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1