一种JVM的内存对象数量统计系统及方法
技术领域
本发明涉及JAVA虚拟机(JVM,JAVA Virtual Machine)技术领域,尤其涉及一种JVM的内存对象数量统计系统及方法。
背景技术
JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。在大型的服务平台中,内部可能存在大量JVM服务器,由于并发量非常大,业务经常发生变化,代码随之做各种改变,所以经常会出现堆栈资源耗尽问题。对于这一问题,传统的解决方法是等发现异常后,由管理人员手动登录具体的JVM服务器,通过JAVA的工具来查看内存占用情况。这种解决方式的缺点是:需要在被监控的JVM服务器上开通端口,存在安全漏洞,并且可监控数量有限。
发明内容
本发明提供了一种JVM的内存对象数量统计系统,能够自动统计JVM服务器的内存占用情况,避免安全漏洞,并能够监控大量JVM服务器。
本发明还提供了一种JVM的内存对象数量统计方法,能够自动统计JVM服务器的内存占用情况,避免安全漏洞,并能够监控大量JVM服务器。
本发明的技术方案是这样实现的:
一种JVM的内存对象数量统计系统,包括:
JVM服务器,用于获取JMAP信息,并将获取的JMAP信息上报至日志收集服务器;
日志收集服务器,用于保存所述JMAP信息;
监控分析服务器,用于对所述日志收集服务器保存的JMAP信息进行分析和归档,得到归档文件,并存储所述归档文件;
Web展示服务器,用于展示所述归档文件。
一种JVM的内存对象数量统计方法,包括:
获取并保存各个JVM服务器的JMAP信息;
对所述JMAP信息进行分析和归档,得到归档文件,存储并展示所述归档文件。
可见,本发明提出JVM的内存对象数量统计系统和方法,由JVM服务器自动收集并上报JAVA内存映射(JMAP,JAVA Virtual Map)信息,并由专门的服务器对各个JVM服务器上报的JMAP信息进行归档及展示,因此能够自动统计JVM服务器的内存占用情况,避免了安全漏洞,并能够监控大量JVM服务器。
附图说明
图1为本发明提出的JVM的内存对象数量统计系统结构示意图;
图2为本发明实施例一中JVM服务器收集及上报JMAP信息的实现流程图;
图3为本发明实施例二中根据用户指令选取归档文件的实现流程图;
图4为本发明实施例三中对归档文件进行汇总分析的实现流程图;
图5为本发明提出的JVM的内存对象数量统计方法实现流程图。
具体实施方式
本发明提出一种JVM的内存对象数量统计系统,如图1为该系统的结构示意图,包括:
JVM服务器101,用于获取JMAP信息,并将获取的JMAP信息上报至日志收集服务器102;
日志收集服务器102,用于保存所述JMAP信息;存储方式可以放在分布式存储服务器上;
监控分析服务器103,用于对所述日志收集服务器102保存的JMAP信息进行分析和归档,得到归档文件,并存储所述归档文件;
Web展示服务器104,用于展示所述归档文件。
以下举具体的实施例详细介绍。
实施例一:
本实施例介绍JVM服务器101收集JMAP信息,并向日志收集服务器102上报的一种具体实现方式。
在本实施例中,JVM服务器101可以包括客户端收集模块和日志客户端模块;其中,
客户端收集模块,可以用于周期性获取JVM服务器上要收集的JAVA进程的信息;针对每个JAVA进程,获取该JVM服务器上所有对象的统计信息;所述对象的统计信息包括:各个类所对应的实例数和字节数;
日志客户端模块,用于将所述JAVA进程的信息及所述统计信息生成JMAP信息,并将所述JMAP信息上报至日志收集服务器。
JVM服务器101可以将生成的JMAP信息先写入本地再上传至日志收集服务器102,也可以采用socket或其它进程通讯或系统通讯方式上传至日志收集服务器102。
如图2为JVM服务器101收集及上报JMAP信息的实现流程图,包括:
步骤201:客户端收集模块周期性获取JVM服务器上要收集的JAVA进程的信息,并将JAVA进程的信息放入队列中;其中,JAVA进程的信息可以包括JAVA进程的ID及JAVA进程的标示;JAVA进程的标示格式可以为:部门代号-业务系统代号-业务系统版本-实例号;
步骤202:从队列中取出一个JAVA进程的信息;
步骤203:针对该JAVA进程,通过jamp-histo命令获取该JVM服务器上所有对象的统计信息;其中,所述对象的统计信息可以包括:各个类所对应的实例数和字节数;
步骤204:将上述JAVA进程的信息及获取的统计信息计入JMAP信息中,由日志客户端模块将JMAP信息上报至日志收集服务器;
步骤205:判断该JAVA进程的信息是否为队列中的最后一个,如果不是,则返回执行步骤202;如果是,则退出本循环周期,结束当前流程。
实施例二:
本实施例介绍根据用户指令选取归档文件进行分析的一种具体实施方式,如图3为本实施例的实现流程图,包括:
步骤301:用户在网络监控图上发现JVM堆栈曲线异常;
步骤302:用户在网络监控图上选取2个差异较大的时间点;
步骤303:点击比较;
步骤304:根据用户指令,监控分析服务器103对上述两个时间点对应的归档文件进行汇总分析,得到分析文件;本步骤详细过程将在以下实施例三中详述;
步骤305:判断是否还需要查看其它时间点,如果是,则返回执行步骤302;否则,结束当前流程。
实施例三:
本实施例介绍实施例二中步骤304的一种实现方式。如图4为本实施例的实现流程图,包括:
步骤401:读取第一个时间点对应的归档文件,记为归档文件1;
步骤402:针对归档文件1,按照类名对每个类进行汇总,汇总内容包括:归档文件1中存在的类所对应的总实例数和总字节数;
步骤403:读取第二个时间点对应的归档文件,记为归档文件2;
步骤404:针对归档文件2,按照类名对每个类进行汇总,汇总内容包括:归档文件2中存在的类所对应的总实例数和总字节数;
步骤405:根据上述步骤402和步骤404中的汇总内容,生成第一分析文件;
第一分析文件的内容可以包括:类分别在两个归档文件中对应的总实例数和总字节数,以及所述类在所述两个归档文件中对应的总实例数的差值和总字节数的差值;
其中,所述类为至少在一个归档文件中存在的类,包括三种情况:仅在归档文件1中存在的类、仅在归档文件2中存在的类、在归档文件1和归档文件2中均存在的类;
当一个类在一个归档文件中不存在时,该类在该归档文件中对应的总实例数和总字节数均为0。
下表一为第一分析文件示例。
表1
由上述第一分析文件,还可以生成其他分析文件,例如:
步骤406:根据用户指令,从第一分析文件中选取用户指令的类所对应的信息,生成第二分析文件。例如,用户指令生成针对特定种类的类(例如用户自己编写的类)的分析文件,该特定种类的类包括类B和类C,生成的第二分析文件如下表2所示。
表2
步骤407:从第一分析文件中选取仅在归档文件1中存在的类所对应的信息,生成第三分析文件,下表3为第三分析文件示例。
表3
步骤408:从第一分析文件中选取仅在归档文件2中存在的类所对应的信息,生成第四分析文件,下表4为第四分析文件示例。
表4
上述分析文件仅为示例,本发明也可以按照用户指令生成包含其他内容的分析文件,以便对JVM的内存对象进行动态分析。
本发明还提出一种JVM的内存对象数量统计方法,如图5为该方法的实现流程图,包括:
步骤501:获取并保存各个JVM服务器的JMAP信息;
步骤502:对所述JMAP信息进行分析和归档,得到归档文件,存储并展示所述归档文件。
上述步骤501中,获取JVM服务器的JMAP信息的方式可以为:
周期性获取所述JVM服务器上要收集的JAVA进程的信息;
针对每个JAVA进程,获取该JVM服务器上所有对象的统计信息;所述对象的统计信息包括:各个类所对应的实例数和字节数;
将所述JAVA进程的信息及所述统计信息生成JMAP信息。
上述过程中,JAVA进程的信息可以包括:JAVA进程的ID及JAVA进程的标示;所述JAVA进程的标示可以包括:部门代号、业务系统代号、业务系统版本和实例号;
归档文件的标记可以包括:部门代号、业务系统代号、业务系统版本、实例号和时间信息。
上述步骤502之后,还可以进一步包括:
步骤503:根据用户的指示选取两个归档文件;
步骤504:针对两个归档文件,分别按照类名进行汇总,得到各个类所对应的总实例数和总字节数;
步骤505:根据所述汇总的内容得到第一分析文件,所述第一分析文件的内容包括:类分别在所述两个归档文件中对应的总实例数和总字节数,以及所述类在所述两个归档文件中对应的总实例数的差值和总字节数的差值;其中,所述类为至少在一个归档文件中存在的类,当一个类在一个归档文件中不存在时,该类在该归档文件中对应的总实例数和总字节数均为0。
上述步骤505之后,还可以进一步包括:
步骤506:根据用户指令,从第一分析文件中选取用户指令的类所对应的信息,生成第二分析文件;
或者,步骤507:从第一分析文件中选取仅在第一个归档文件中存在的类所对应的信息,生成第三分析文件;
或者,步骤508:从第一分析文件中选取仅在第二个归档文件中存在的类所对应的信息,生成第四分析文件。
综上可见,本发明提出的JVM的内存对象数量统计系统和方法,采用JMAP信息主动推送的方式,避免由于多开端口而导致的安全隐患,同时能够实现对大量JVM服务器的监控及历史数据的保存;由于只对JMAP信息进行保存和统计,而不是对dump文件进行统计,能够加快分析速度;最重要的是,能够分析出JVM内存对象总数在指定的不同时间段的变化情况。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。