首页> 中国专利> 一种Java程序内存使用情况监控方法及装置

一种Java程序内存使用情况监控方法及装置

摘要

本发明提供了一种Java程序内存使用情况监控方法及装置,可以应用于金融领域,方法包括:通过调用Java管理扩展接口实时获取Java内存中各区的指标数据,指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据;根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。本申请提供的Java程序内存使用情况监控方法,对内存进行分区,然后针对每个分区,结合垃圾回收情况和内存占用情况对Java程序内存进行监控,实现了在不影响系统性能的情况下对内存进行精确监控的技术效果。

著录项

  • 公开/公告号CN112835765A

    专利类型发明专利

  • 公开/公告日2021-05-25

    原文格式PDF

  • 申请/专利权人 中国工商银行股份有限公司;

    申请/专利号CN202110140616.9

  • 发明设计人 刘慕雨;王泽洋;黄镜澄;唐月标;

    申请日2021-02-02

  • 分类号G06F11/30(20060101);G06F9/50(20060101);

  • 代理机构11127 北京三友知识产权代理有限公司;

  • 代理人任默闻;孙乳笋

  • 地址 100140 北京市西城区复兴门内大街55号

  • 入库时间 2023-06-19 11:05:16

说明书

技术领域

本申请属于Java程序性能监控技术领域,具体地讲,涉及一种Java程序内存使用情况监控方法及装置。

背景技术

当前,Java虚拟机提供了一套垃圾回收机制,可以让Java开发者不必关心内存的分配和清理等工作。但是该套垃圾回收机制在实际运行中常常因为内存使用不当等原因使得Java虚拟机内存使用率不断升高,直到Java虚拟机内存溢出(OUT OF MEMORY,OOM)。Java虚拟机自身提供的内存监控工具,如JMAP、JSTACK、JPS等命令行工具,其原理都是当内存使用出问题时,通过远程连接到Java虚拟机进行通讯,这些内存监控工具的缺点在于:只适合在内存使用发生问题之后的排查阶段使用,不适合提前预警。而且,远程连接本身需要占用一定的系统资源,因此,不适合作为常规的监控工具。另外,当前针对Java内存的监控仅监控内存整体使用率数值,这样不易发现问题,因为Java虚拟机实际上将内存区分成了不同的区域,因此不能单纯依赖一个内存整体使用率数值来表征不同内存区域的情况。

发明内容

本申请提供了一种Java程序内存使用情况监控方法及装置,以至少解决现有的Java内存监控工具需要远程连接,而远程连接不仅占用系统资源而且只能对Java虚拟机的整体内存进行监控,无法实现监控精细化的问题。

根据本申请的一个方面,提供了一种Java程序内存使用情况监控方法,包括:

通过调用Java管理扩展接口实时获取Java内存中各区的指标数据,指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据;

根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

在一实施例中,Java程序内存使用情况监控方法还包括:

根据Java内存中垃圾回收算法的类型对Java内存进行分区处理。

在一实施例中,当指标数据为内存使用量时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,包括:

获取预设时间段内每一时刻的内存使用量;

根据内存使用量计算预设时间段内的内存平均使用量。

在一实施例中,当指标数据为内存使用最大值时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,包括:

获取各时段的内存使用最大值;

通过比较各时段的内存使用最大值确定内存最大瞬时使用值。

在一实施例中,当指标数据为垃圾回收次数时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,包括:

获取预设时间段内的垃圾回收次数;

根据垃圾回收次数确定预设时间段内的垃圾回收频率。

在一实施例中,当指标数据为垃圾回收耗时时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,包括:

获取预设时间段内每次垃圾回收耗时;

根据每次垃圾回收耗时确定预设时间段内的垃圾回收平均耗时。

根据本申请的另一个方面,还提供了一种Java程序内存使用情况监控装置,包括:

指标数据获取单元,用于通过调用Java管理扩展接口实时获取Java内存中各区的指标数据,指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

聚合计算单元,用于通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据;

实时预警单元,用于根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

在一实施例中,Java程序内存使用情况监控装置还包括:

内存分区处理单元,用于根据Java内存中垃圾回收算法的类型对Java内存进行分区处理。

在一实施例中,当指标数据为内存使用量时,聚合计算单元包括:

瞬时内存使用量获取模块,用于获取预设时间段内每一时刻的内存使用量;

内存平均使用量获取模块,用于根据内存使用量计算预设时间段内的内存平均使用量。

在一实施例中,当指标数据为内存使用最大值时,聚合计算单元包括:

内存使用最大值获取模块,用于获取各时段的内存使用最大值;

最大瞬时使用值获取模块,用于通过比较各时段的内存使用最大值确定内存最大瞬时使用值。

在一实施例中,当指标数据为垃圾回收次数时,聚合计算单元包括:

垃圾回收次数获取模块,用于获取预设时间段内的垃圾回收次数;

垃圾回收频率确定模块,用于根据垃圾回收次数确定预设时间段内的垃圾回收频率。

在一实施例中,当指标数据为垃圾回收耗时时,聚合计算单元包括:

垃圾回收耗时获取模块,用于获取预设时间段内每次垃圾回收耗时;

平均耗时求取模块,用于根据每次垃圾回收耗时确定预设时间段内的垃圾回收平均耗时。

本申请提供的Java程序内存使用情况监控方法,对内存进行分区,然后针对每个分区,结合垃圾回收情况和内存占用情况对Java程序内存进行监控,实现了在不影响系统性能的情况下对内存进行精确监控的技术效果。

附图说明

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

图1为本申请提供的一种Java程序内存使用情况监控方法流程图。

图2为本申请实施例中当指标数据为内存使用量时对其进行聚合计算的方法流程图。

图3为本申请实施例中当指标数据为内存使用最大值时对其进行聚合计算的方法流程图。

图4为本申请实施例中当指标数据为垃圾回收次数时对其进行聚合计算的方法流程图。

图5为本申请实施例中当指标数据为垃圾回收耗时时对其进行聚合计算的方法流程图。

图6为本申请提供的一种Java程序内存使用情况监控装置结构框图。

图7为本申请实施例中当指标数据为内存使用量时聚合计算单元的结构框图。

图8为本申请实施例中当指标数据为内存使用最大值时聚合计算单元的结构框图。

图9为本申请实施例中当指标数据为垃圾回收次数时聚合计算单元的结构框图。

图10为本申请实施例中当指标数据为垃圾回收耗时时聚合计算单元的结构框图。

图11为本申请实施例中一种电子设备的具体实施方式。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本申请的具体实施方式可以应用于金融领域,或除金融领域外的其他领域,本申请不以此为限。

一般情况下,Java内存可以分成程序计数器、虚拟机栈、本地房发展、堆以及方法区五个部分,堆内存最常出现内存溢出的情况,对堆内存的垃圾回收多采用分代回收机制,也就是把堆内存分为年轻代和老年代。由于虚拟机进行垃圾回收的时候会暂停用户线程,如果垃圾回收耗时久或频率高都会影响到系统运行,因此,对Java程序内存的监控应该从内存、垃圾回收的角度完整看待。

为了解决现有技术中缺少从垃圾回收角度对Java内存进行监控的问题,本申请提供了一种Java程序内存使用情况监控方法,如图1所示,包括:

S101:通过调用Java管理扩展接口实时获取Java内存中各区的指标数据。指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

S102:通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据。

S103:根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

图1所示方法的执行主体可以为PC、终端等,通过实时监控Java内存中垃圾回收相关指标和内存使用相关指标,从垃圾回收的角度来实时监控内存的使用情况,并且设置阈值,当垃圾回收相关指标突破阈值时,即启动预警系统,实现了通过垃圾回收指标对Java内存使用情况进行监控预警的技术效果。

在一具体实施例中,图1所示的方法通过侵入(Java SDK)或者非侵入(Javaagent)的方式,在Java程序启动的时候对指标采集程序进行初始化。通过调用Java管理扩展接口定时采集内存使用的相关指标数据,采集数据时,按照内存的分区分别进行采集,内存分区的方法详见下述实施例。当采集到内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时等指标数据后,采用实时计算数据库Druid针对不同类型的指标数据按分钟进行聚合计算获得各区内存使用数据,然后通过实时比较各区内存使用数据与预设值的大小,当某一区域的内存使用数据超过了预设值时,进行报警,通知相关技术人员。

在一实施例中,Java程序内存使用情况监控方法还包括:

根据Java内存中垃圾回收算法的类型对Java内存进行分区处理。

通过对Java内存进行分区处理,使得内存使用率的监控更加精细化,当内存出现问题,可以具体精确地定位内存使用率出现问题的区域,从而做到有的放矢地进行监控和管理。

在一具体实施例中,不同的垃圾回收算法决定了不同堆内存区域的命名,常用的垃圾回收算法分为四类:SERIAL、PARALLEL、CMS、G1。因此,从垃圾回收算法的角度出发,对于SERIAL算法,老年代采用MarkSweepCompact算法,年轻代采用Copy算法;对于PARALLEL算法,老年代采用PS MarkSweep算法,年轻代采用PS Scavenge算法;对于CMS算法,老年代采用ConcurrentMarkSweep算法,年轻代采用ParNew算法;对于G1算法,老年代采用G1 OldGeneration算法,年轻代采用G1 Young Generation算法。因此,在调用Java管理扩展接口的时候,通过老年代算法的名称,即可区分出垃圾回收算法的类型。然后根据不同的算法类型,再调用Java管理扩展的相关接口,查询出垃圾回收时间和垃圾回收次数。不同的垃圾回收算法,对堆内存区域的命名也不同,因此,区分出垃圾回收算法的类型之后,即可根据相应的内存分区的名称,然后执行S101的步骤获取每个分区的指标数据。

在一实施例中,当指标数据为内存使用量时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,如图2所示,包括:

S201:获取预设时间段内每一时刻的内存使用量。

S202:根据内存使用量计算预设时间段内的内存平均使用量。

在一具体实施例中,将采集到的各类指标数据保存至队列,kafka负责将数据存储到文件系统,并提供网络接口,数据消费者可以通过接口订阅指定的TOPIC数据。获取T时间段内每一时刻的内存使用量数据,然后将内存使用量数据进行平均求值即可获得T时间段内内存的平均使用量。

在一实施例中,当指标数据为内存使用最大值时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,如图3所示,包括:

S301:获取各时段的内存使用最大值。

S302:通过比较各时段的内存使用最大值确定内存最大瞬时使用值。

在一具体实施例中,将采集到的各类指标数据保存至队列,kafka负责将数据存储到文件系统,并提供网络接口,数据消费者可以通过接口订阅指定的TOPIC数据。分别获取T1、T2、T3三个时段中的内存使用最大值M1、M2和M3,比较M1、M2和M3的大小,从而可以获得T1、T2、T3三个时段的内存最大瞬时使用值。

在一实施例中,当指标数据为垃圾回收次数时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,如图4所示,包括:

S401:获取预设时间段内的垃圾回收次数。

S402:根据垃圾回收次数确定预设时间段内的垃圾回收频率。

在一具体实施例中,将采集到的各类指标数据保存至队列,kafka负责将数据存储到文件系统,并提供网络接口,数据消费者可以通过接口订阅指定的TOPIC数据。从指定的TOPIC中获取某一时间段T中发生的垃圾回收次数N次,根据垃圾回收次数N和时间段T的时长即可求得该时间段内垃圾的回收频率N/T。

在一实施例中,当指标数据为垃圾回收耗时时,通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据,如图5所示,包括:

S501:获取预设时间段内每次垃圾回收耗时。

S502:根据每次垃圾回收耗时确定预设时间段内的垃圾回收平均耗时。

在一具体实施例中,监测到T时间段内发生了N次垃圾回收,每次垃圾回收的耗时分别为t

在获得各区内存使用数据之后,将内存使用数据存储至文件系统,然后通过接口提供给外部进行访问、查询存储的数据。

根据不同的查询条件,从文件系统中查询数据,将查询出的数据以例如图表的方式进行可视化展示以供开发和运维人员分析。JAV阿虚拟机在进行垃圾回收时,会挂起应用线程,因此,当垃圾回收频率过高(超过设定值)或者垃圾回收耗时超过预设值的情况下,会直接影响应用的吞吐量,此时应当进行预警。当系统的内存使用率过高的情况下容易发生内存溢出,因此当内存使用率超过了预设值时即进行预警。当垃圾回收后,内存的空间应当获得一定的释放,为了关注垃圾回收后内存空间是否得到有效释放,即垃圾回收前和垃圾回收后的内存变化。如果垃圾回收效果不佳,比如垃圾回收后内存大小与垃圾回收前内存大小之间的差值低于预设值,则需要进行预警,并排查内存使用详情或调整内存分配比例。

基于同一发明构思,本申请实施例还提供了一种Java程序内存使用情况监控装置,可以用于实现上述实施例中所描述的方法,如下面实施例所述。由于Java程序内存使用情况监控装置解决问题的原理与Java程序内存使用情况监控方法相似,因此Java程序内存使用情况监控装置的实施可以参见Java程序内存使用情况监控方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

根据本申请的另一个方面,还提供了一种Java程序内存使用情况监控装置,如图6所示,包括:

指标数据获取单元601,用于通过调用Java管理扩展接口实时获取Java内存中各区的指标数据,指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

聚合计算单元602,用于通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据;

实时预警单元603,用于根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

在一实施例中,Java程序内存使用情况监控装置还包括:

内存分区处理单元,用于根据Java内存中垃圾回收算法的类型对Java内存进行分区处理。

在一实施例中,如图7所示,当指标数据为内存使用量时,聚合计算单元602包括:

瞬时内存使用量获取模块701,用于获取预设时间段内每一时刻的内存使用量;

内存平均使用量获取模块702,用于根据内存使用量计算预设时间段内的内存平均使用量。

在一实施例中,如图8所示,当指标数据为内存使用最大值时,聚合计算单元602包括:

内存使用最大值获取模块801,用于获取各时段的内存使用最大值;

最大瞬时使用值获取模块802,用于通过比较各时段的内存使用最大值确定内存最大瞬时使用值。

在一实施例中,如图9所示,当指标数据为垃圾回收次数时,聚合计算单元602包括:

垃圾回收次数获取模块901,用于获取预设时间段内的垃圾回收次数;

垃圾回收频率确定模块902,用于根据垃圾回收次数确定预设时间段内的垃圾回收频率。

在一实施例中,如图10所示,当指标数据为垃圾回收耗时时,聚合计算单元602包括:

垃圾回收耗时获取模块1001,用于获取预设时间段内每次垃圾回收耗时;

平均耗时求取模块1002,用于根据每次垃圾回收耗时确定预设时间段内的垃圾回收平均耗时。

本申请的实施例还提供能够实现上述实施例中的方法中全部步骤的一种电子设备的具体实施方式,参见图11,所述电子设备具体包括如下内容:

处理器(processor)1101、内存1102、通信接口(Communications Interface)1103、总线1104和非易失性存储器1105;

其中,所述处理器1101、内存1102、通信接口1103和非易失性存储器1105通过所述总线1104完成相互间的通信;

所述处理器1101用于调用所述内存1102和非易失性存储器1105中的计算机程序,所述处理器执行所述计算机程序时实现上述实施例中的方法中的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:

S101:通过调用Java管理扩展接口实时获取Java内存中各区的指标数据。指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

S102:通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据。

S103:根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

本申请的实施例还提供能够实现上述实施例中的方法中全部步骤的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:

S101:通过调用Java管理扩展接口实时获取Java内存中各区的指标数据。指标数据包括:内存使用量、内存使用最大值、垃圾回收次数和垃圾回收耗时;

S102:通过实时计算数据库对指标数据按照设定的时间单位进行聚合计算获得各区内存使用数据。

S103:根据各区内存使用数据与预设阀值的大小关系对各区内存使用情况进行实时预警。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于硬件+程序类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。虽然本说明书实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。本领域技术人员应明白,本说明书的实施例可提供为方法、系统或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书实施例的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。以上所述仅为本说明书实施例的实施例而已,并不用于限制本说明书实施例。对于本领域技术人员来说,本说明书实施例可以有各种更改和变化。凡在本说明书实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书实施例的权利要求范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号