一种基于垃圾回收日志的异常处理方法及装置

文档序号:1952374 发布日期:2021-12-10 浏览:28次 >En<

阅读说明:本技术 一种基于垃圾回收日志的异常处理方法及装置 (Exception handling method and device based on garbage collection log ) 是由 熊晓斌 张照猛 于 2021-11-10 设计创作,主要内容包括:本发明公开了一种基于垃圾回收日志的异常处理方法及装置,其中所述方法包括:根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;在预设路径中读取所述GC日志,并从GC日志中提取待分析数据;其中,待分析数据用于进行异常分析;将待分析数据输入预设的识别模型进行识别,获得异常分析结果;根据异常分析结果,对JVM参数进行调优。本发明方法及装置可能综合利用所有待分析数据,避免人工识别时仅仅考虑内存使用情况,而无法识别出JVM高负载的异常。因此,本实施例的方法提高了异常识别的准确性和效率。(The invention discloses an exception handling method and device based on a garbage collection log, wherein the method comprises the following steps: generating a GC log according to a preset GC log generation parameter and storing the GC log to a preset path; reading the GC log in a preset path, and extracting data to be analyzed from the GC log; wherein, the data to be analyzed is used for carrying out anomaly analysis; inputting data to be analyzed into a preset identification model for identification to obtain an abnormal analysis result; and adjusting and optimizing the JVM parameters according to the abnormal analysis result. The method and the device can comprehensively utilize all the data to be analyzed, and avoid the problem that the JVM high-load abnormity cannot be identified only by considering the use condition of the memory during manual identification. Therefore, the method of the embodiment improves the accuracy and efficiency of the abnormality identification.)

一种基于垃圾回收日志的异常处理方法及装置

技术领域

本发明涉及计算机软件技术领域,尤其涉及一种基于垃圾回收日志的异常处理方法及装置。

背景技术

在日常的软件开发过程中,都会不可避免的要处理异常。企业级Java开发中,有时候我们会碰到下面这些问题:内存溢出,内存不足,内存泄露,线程死锁,锁争用,Java进程消耗CPU过高等等。JVM(Java Virtual Machine,Java虚拟机)管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域,Class需要存储的内容主要包括方法和静态属性。堆区域用来存放Class的实例,即对象;对象需要存储的内容主要是非静态属性。每次用new创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被JVM的垃圾回收机制管理。而Java栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。Java程序的每个线程中都有一个独立的堆栈。容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。

JVM由于GC(garbagecollection,垃圾回收)机制的作用,即JVM内存快用满的时候,系统会自动触发垃圾回收,清除一些无用的java对象以回收内存空间。通过内存使用率来表征JVM负载高低的方式并不能很好地反应JVM真实负载情况。内存使用率很高的时候,很可能JVM中的java对象可以被GC有效回收,这种情况下JVM负载的真实情况是不高的,如果直接用内存使用率来表征,就会误判为高负载,进而做出一系列不必要的响应措施、影响用户的使用体验,例如,频繁发送风险预警、频繁限制用户请求,等等。而在内存使用率不是很高的时候,有可能JVM中的活动线程正在飞快地创建java对象,按照java对象的生命周期规律,这种对象一般在短时间内很难被GC有效回收,这会导致JVM迅速进入超负荷状态,这种情况下JVM负载的真实情况是很高的,如果直接用内存使用率来表征,就会误判为中低负载,因此错失采取有效运维措施的良机、进而影响系统稳定运行。

因此,目前现有技术采用内存使用率来分析JVM负载,容易出现错误预警的问题。

发明内容

鉴于上述问题,本发明提出了一种基于垃圾回收日志的异常处理方法及装置,提高了异常识别的准确性和效率。

第一方面,本申请通过一实施例提供如下技术方案:

一种基于垃圾回收日志的异常处理方法,包括:

根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;在所述预设路径中读取所述GC日志,并从所述GC日志中提取待分析数据;其中,所述待分析数据用于进行异常分析;将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果;根据所述异常分析结果,对JVM参数进行调优。

可选的,所述将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果之前,还包括:

获取历史待分析数据;其中,所述历史待分析数据为从历史GC日志中提取的数据;对所述历史待分析数据标定异常结果;将所述历史待分析数据和所述异常结果输入预设的初始模型进行训练,获得识别模型。

可选的,所述异常分析结果为新生代提升过快导致的停顿时间超长;所述根据所述异常分析结果,对JVM参数进行调优,包括:

获取所述异常分析结果对应回收频率;根据所述回收频率,增加新生代空间以及增加新生代的晋升阈值。

可选的,所述根据所述异常分析结果,对JVM参数进行调优,还包括:

若所述新生代空间达到最大,判断老年代占比是否达到预设的比例阈值;其中,所述比例阈值由系统的计算吞吐量和问题发生频率确定,所述问题发生频率为所述新生代提升过快导致的停顿时间超长的频率;若是,则启动CMS垃圾收集器。

可选的,所述异常分析结果为老年代碎片化导致的停顿时间超长;所述根据所述异常分析结果,对JVM参数进行调优,包括:

获取所述异常分析结果对应回收频率;根据所述回收频率和执行Full GC回收后的空间释放大小,增加老年代空间。

可选的,所述异常分析结果为内存泄露;所述根据所述异常分析结果,对JVM参数进行调优,包括:

释放无用对象的引用;其中,引用变量在退出活动域后重置为null。

第二方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:

一种基于垃圾回收日志的异常处理装置,包括:

日志获取模块,用于根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;数据提取模块,用于在所述预设路径中读取所述GC日志,并从所述GC日志中提取待分析数据;其中,所述待分析数据用于进行异常分析;识别模块,用于将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果;优化模块,用于根据所述异常分析结果,对JVM参数进行调优。

可选的,还包括模型训练模块,用于在所述将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果之前:

获取历史待分析数据;其中,所述历史待分析数据为从历史GC日志中提取的数据;对所述历史待分析数据标定异常结果;将所述历史待分析数据和所述异常结果输入预设的初始模型进行训练,获得识别模型。

第三方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:

一种电子设备,包括处理器和存储器,所述存储器耦接到所述处理器,所述存储器存储指令,当所述指令由所述处理器执行时使所述电子设备执行上述第一方面中任一项所述方法的步骤。

第四方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:

一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一方面中任一项所述方法的步骤。

本实施例中提供的一种基于垃圾回收日志的异常处理方法及装置,首先根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;然后,在预设路径中读取GC日志,并从GC日志中提取待分析数据;待分析数据用于进行异常分析;接着,将待分析数据输入预设的识别模型进行识别,获得异常分析结果;最后,根据异常分析结果,对JVM参数进行调优。由于,在异常分析的过程中采用识别模型进行识别和处理,能够保证整个识别过程自动进行并且实时执行;此外,在进行异常识别时是基于提取的所有待分析数据进行的识别,可能综合利用所有待分析数据,避免人工识别时仅仅考虑内存使用情况,而无法识别出JVM高负载的异常。因此,本实施例的方法提高了异常识别的准确性和效率。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的

具体实施方式

附图说明

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

图1示出了本发明第一实施例提供的一种基于垃圾回收日志的异常处理方法的流程图;

图2示出了本发明第二实施例提供的一种基于垃圾回收日志的异常处理装置的功能模块结构示意图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。

第一实施例

请参见图1,示出了本发明第一实施例提供的一种基于垃圾回收日志的异常处理方法的流程图。所述方法包括:

步骤S10:根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;

步骤S20:在所述预设路径中读取所述GC日志,并从所述GC日志中提取待分析数据;其中,所述待分析数据用于进行异常分析;

步骤S30:将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果;

步骤S40:根据所述异常分析结果,对JVM参数进行调优。

本实施例中通过步骤S10~S40,通过将GC日志输出后提取出相应的待分析数据;然后将待分析数据输入预设的识别模型进行识别,就可获得对应的异常分析结果;最后,基于异常分析结果就可实现对JVM参数进行优化调整。由于,在异常分析的过程中采用识别模型进行识别和处理,能够保证整个识别过程自动进行并且实时执行;此外,在进行异常识别时是基于提取的所有待分析数据进行的识别,可能综合利用所有待分析数据,避免人工识别时仅仅考虑内存使用情况,而无法识别出JVM高负载的异常。因此,本实施例的方法提高了异常识别的准确性和效率。下面分别对各个步骤的具体实现进行具体说明。

步骤S10:根据预设的GC日志的生成参数,生成GC日志并存储至预设路径。

在步骤S10中,首先需要输出GC日志,因此,需要设置GC日志的生成参数;例如,收集器类型,期望达到的最大回收停顿时间,堆的最大内存,等等。一具体示例如下:

‐XX:+UseG1GC,设置收集器类型,使用G1垃圾收集器;

‐XX:MaxGCPauseMillis=100,设置期望达到的最大GC停顿时间指标(JVM尽力实现,不能保证达到),默认为200毫秒;

‐Xmx256m,设置堆的最大内存;

‐XX:+PrintGCDetails,打印GC日志;

‐XX:+PrintGCTimeStamps,输入GC的基准时间戳;

‐XX:+PrintGCDateStamps,输入GC的时间戳(以日期的形式);

‐XX:+PrintHeapAtGC,在进行GC的前后打印出堆的信息;

‐Xloggc:/root/opt/gc.log,GC日志文件的预设路径。

通过上述生成参数的设置,可实现GC日志的实时的自动触发和输出;打印日志时。

步骤S20:在所述预设路径中读取所述GC日志,并从所述GC日志中提取待分析数据;其中,所述待分析数据用于进行异常分析。

在步骤S20中,待分析数据可包括:堆内存信息、计算吞吐量、年轻代和老年代的分配比例、年代大小、升级年龄、GC发生的原因、GC发生的次数、GC发生的暂停时间等等。在获取到GC日志之后可通过识别关键字段的方式来提取待分析数据。每个关键字段均有一对应的目标待分析数据,当检测到关键字段后,可将该关键字段所描述的数据进行提取作为目标待分析数据。进一步的,可构建一待分析数据的表格模板,在该表格模板中包含待分析数据的名称和待分析数据的值;每类待分析数据的名称对应一个或多个关键字段。接着,可在对GC日志进行关键字段识别时,将识别出的关键字段对应的值映射至表格模板中,从而提取GC日志中所有的待分析数据。

步骤S30:将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果;

在步骤S30中,待分析数据输入预设的识别模型;本实施例中,可采用常用的机器学习算法,进行模型构建;并且采用有监督学习训练,从而提高获得的识别模型的可靠性。具体的,在模型训练过程可参考如下:首先,获取历史待分析数据,历史待分析数据为从历史GC日志中提取的数据;接着,对历史待分析数据标定异常结果,可通过人工识别的方式标定异常结果;由于在某一异常结果可能是由不同的参数共同影响的,当标定每一组历史待分析数据时,其中就可包含多个数据之间的相互关系,一组历史待分析数据为某一时刻GC日志中的数据。一组历史待分析数据可被标定多个异常结果,不作限制。最后,将历史待分析数据和异常结果输入预设的初始模型进行训练,获得识别模型。这样,训练出来的识别模型就能够基于多个参数进行异常识别,而不仅仅依耐内存占用率进行故障判断,提高了识别的可靠性。

例如,当垃圾回收频率较高,但是内存占用率较低时,且垃圾回收之后内存使用率变化不大时,可能为处理器高负载状态。若按照现有的分析方法是无法识别出具体原因的。而本实施例中采用识别模型的方式,至少综合识别了垃圾回收频率、内存占用率以及垃圾回收之后的内存使用率变化等多个数据,可有效的识别出当前JVM的异常,得到准确的异常分析结果。

进一步的,在本实施例中获取的异常分析结果还可通过可视化图表的形式进行输出。例如,可视化图表可包括异常分析结果的具体类型,以及该异常分析结果对应的分析指标(待分析数据中对应的参数)。

步骤S40:根据所述异常分析结果,对JVM参数进行调优。

当异常分析结果为停顿时间超长时,一般对应于垃圾收集器长时间停顿,在软件Web页面上可能出现页面响应码500等的服务器错误问题。具体的:

当异常分析结果为新生代提升过快导致的停顿时间超长时;在步骤S40包括:

获取异常分析结果对应回收频率;根据回收频率,增加新生代空间以及增加新生代的晋升阈值。该异常分析结果对应于回收频率过快时,说明新生代空间不足,此时可适当的增加新生代空间,使新生代可容纳更多的新建对象;进一步的,增加新生代的晋升阈值,避免新生代过快的转化为老年代。

若内存有限,则可按照如下的方式进行JVM调优:

若新生代空间达到最大,判断老年代占比是否达到预设的比例阈值;其中,比例阈值由系统的计算吞吐量和问题发生频率确定,问题发生频率为新生代提升过快导致的停顿时间超长的频率;若老年代占比达到预设的比例阈值,则启动CMS垃圾收集器。需要说明的是,越早启动CMS垃圾收集器,异常发生频率越低,但是会降低计算吞吐量;在调整比例阈值时,可根据需要的计算吞吐量和可接受的异常发生频率进行调试确定,找到比例阈值的平衡点。进一步的,还可控制执行n次CMS垃圾回收后,进行一次压缩式Full GC;其中,n可根据内存不足的发生频率进行设定。

当异常分析结果为老年代碎片化导致的停顿时间超长;步骤S40可包括:获取异常分析结果对应回收频率;根据回收频率和执行Full GC回收后的空间释放大小,增加老年代空间。具体的,当回收频率超过预设的回收阈值,并且执行Full GC回收后的空间释放大小小于预设的空间释放阈值,例如释放小于1%;此时,回收频率越大且空间释放越少,则增加老年代空间可越大;具体的,增加的老年代空间大小可在一定范围内与回收频率超过回收阈值的多少正相关,与空间释放大小的负相关。此外,还可调大Survivor区的方式来实现调优。

当异常分析结果为内存泄露;步骤S40的执行,可包括:释放无用对象的引用;其中,引用变量在退出活动域后重置为null。此外,还可调整程序进行字符串处理时,采用StringBuffer类型,而避免采用String类型;还可禁止或避免集中创建对象,尤其是大对象,调高使用流操作的优先级。禁止或避免在经常调用的方法中创建对象,尤其是在循环中创建对象;其中,可根据方法被调用的频率判断是否被经常调用。

通过上述自动化调优处理,可准确的针对不同类型的异常类型进行优化,保证JVM的最佳运行状态,同时避免程序执行效率的下降,提高稳定性。

进一步的,在本实施例中还可针对部分异常分析结果进行故障代码定位。

当异常分析结果为JAVA进程消耗处理器资源过高时,可通过预设的命令弹出JVM内存映像(dump文件);然后,基于内存泄露工具对dump文件进行分析。例如,预设命令为jmap -dump:format=b,file=mydump.bin pid(2)。

当异常分析结果为JAVA进程消耗处理器资源过高时,首先可对java进程进行分析,然后找到对应“问题线程”的ID(Identity Document,身份标示号),根据线程的堆栈信息找到代码,最后进行代码分析和排查。具体的,可执行预设的top命令定位到消耗处理器最高的进程,并记住进程pid;接着,通过top-Hp pid找到问题线程,记住线程tid;再接着,通过jstack-l tid >jstack.log 将线程堆栈信息dump到指定文件中,线程tid是十进制的,堆栈中的线程id是16进制,使用printf“%x\n”tid转换。通过转化的16进制数字从堆栈信息中找到对应的线程堆栈,如果有GC线程,可以推断内存泄露导致频发的GC,通过jstat-gcutil pid 1s查看代码,从而实现故障代码定位。

综上所述,本实施例中提供的一种基于垃圾回收日志的异常处理方法及装置,首先根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;然后,在预设路径中读取GC日志,并从GC日志中提取待分析数据;待分析数据用于进行异常分析;接着,将待分析数据输入预设的识别模型进行识别,获得异常分析结果;最后,根据异常分析结果,对JVM参数进行调优。由于,在异常分析的过程中采用识别模型进行识别和处理,能够保证整个识别过程自动进行并且实时执行;此外,在进行异常识别时是基于提取的所有待分析数据进行的识别,可能综合利用所有待分析数据,避免人工识别时仅仅考虑内存使用情况,而无法识别出JVM高负载的异常。因此,本实施例的方法提高了异常识别的准确性和效率。

第二实施例

请参阅图2,基于同一发明构思,本发明第二实施例提供了一种基于垃圾回收日志的异常处理装置300。所述基于垃圾回收日志的异常处理装置300包括:

日志获取模块301,用于根据预设的GC日志的生成参数,生成GC日志并存储至预设路径;数据提取模块302,用于在所述预设路径中读取所述GC日志,并从所述GC日志中提取待分析数据;其中,所述待分析数据用于进行异常分析;识别模块303,用于将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果;优化模块304,用于根据所述异常分析结果,对JVM参数进行调优。

作为一种可选的实施方式,还包括模型训练模块,用于在所述将所述待分析数据输入预设的识别模型进行识别,获得异常分析结果之前:

获取历史待分析数据;其中,所述历史待分析数据为从历史GC日志中提取的数据;对所述历史待分析数据标定异常结果;将所述历史待分析数据和所述异常结果输入预设的初始模型进行训练,获得识别模型。

作为一种可选的实施方式,所述异常分析结果为新生代提升过快导致的停顿时间超长;所述优化模块304,具体用于:

获取所述异常分析结果对应回收频率;根据所述回收频率,增加新生代空间以及增加新生代的晋升阈值。

作为一种可选的实施方式,所述优化模块304,还具体用于:

若所述新生代空间达到最大,判断老年代占比是否达到预设的比例阈值;其中,所述比例阈值由系统的计算吞吐量和问题发生频率确定,所述问题发生频率为所述新生代提升过快导致的停顿时间超长的频率;若是,则启动CMS垃圾收集器。

作为一种可选的实施方式,所述异常分析结果为老年代碎片化导致的停顿时间超长;所述优化模块304,还具体用于:

获取所述异常分析结果对应回收频率;根据所述回收频率和执行Full GC回收后的空间释放大小,增加老年代空间。

作为一种可选的实施方式,所述异常分析结果为内存泄露;所述所述优化模块304,还具体用于:

释放无用对象的引用;其中,引用变量在退出活动域后重置为null。

需要说明的是,本发明实施例所提供的基于垃圾回收日志的异常处理装置300,其具体实现及产生的技术效果和前述方法实施例相同,为简要描述,装置实施例部分未提及之处,可参考前述方法实施例中相应内容。

第三实施例

基于同一发明构思,在本实施例中还提供了一种电子设备,包括处理器和存储器,所述存储器耦接到所述处理器,所述存储器存储指令,当所述指令由所述处理器执行时使所述电子设备执行前述方法实施例中任一项所述方法的步骤。需要说明的是,本发明实施例所提供的电子设备中,其中当所述指令由所述处理器执行时,每个步骤的具体实现及产生的技术效果和前述方法实施例相同,为简要描述,本实施例未提及之处可参考前述方法实施例中相应内容。

第四实施例

基于同一发明构思,在本实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述方法实施例中任一项所述方法的步骤。需要说明的是,本发明实施例所提供的计算机可读存储介质中,其中当程序被处理器执行时,每个步骤的具体实现及产生的技术效果和前述方法实施例相同,为简要描述,本实施例未提及之处可参考前述方法实施例中相应内容。

本文中出现的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系;单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

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

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

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

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

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

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

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:用于执行纠错操作和错误校验操作的电子器件

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!