一种内存溢出监测方法、装置、设备及存储介质制造方法及图纸

技术编号:37989648 阅读:9 留言:0更新日期:2023-06-30 10:04
本申请涉及一种内存溢出监测方法、装置、设备及存储介质,通过监控向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险的情况下,确定近期加载的类名的固有部分对应的加载次数、以及所有加载的类名的固有部分对应的次数。并基于近期加载的类名的固有部分对应的加载次数、以及加载的所有类的类名的固有部分对应的加载次数对溢出的类进行监测。本申请对于在类元数据空间溢出或者存在溢出风险时,可以简单高效地对导致溢出的类进行监测。测。测。

【技术实现步骤摘要】
一种内存溢出监测方法、装置、设备及存储介质


[0001]本申请属于内存管理
,尤其涉及一种内存溢出监测方法、装置、设备及存储介质。

技术介绍

[0002]Java虚拟机(Java Virtual Machine,简称为JVM)加载类的时候,记录类的元数据,简称为类元数据(Class Meta Data),这些数据会保存在一个单独的内存区域内,该内存区域称为类元数据空间。在Java 7里,这个空间被称为永久代(Permanent Generation space,简称为PermGen或PermGenspace),在Java 8里,使用元空间(Metaspace)代替了永久代。
[0003]在实际应用中,可以设置类元数据空间的最大容量。在PermGen中称为PermSize和MaxPermSize。在Metaspace中称为MaxMetaspaceSize,用于限制本地内存分配给类元数据的大小。相关技术中,不论是PermGen还是Metaspace在遇到类元数据泄漏引发的内存溢出(out of memory,简称OOM)时,都难以进行对导致溢出的类加载进行监测。

技术实现思路

[0004]本申请提供了一种内存溢出监测方法、装置、设备及存储介质,以解决现有技术中难以对导致溢出的类进行监测的技术问题。
[0005]根据本申请的一方面,提供了一种内存溢出监测方法,包括:
[0006]在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;/>[0007]在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;
[0008]确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
[0009]确定所述时间所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
[0010]在本申请一实施例中,还包括:
[0011]确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
[0012]在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
[0013]在本申请一实施例中,监测向虚拟机加载类,包括:
[0014]监测类加载器的加载类方法;和/或
[0015]监测字节码转换器的转换方法。
[0016]在本申请一实施例中,确定类名的固有部分,并确定每个固有部分对应的加载次
数,包括:
[0017]对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;
[0018]将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。
[0019]在本申请一实施例中,预测溢出风险的方法,包括:
[0020]按照预设周期获取当前所述虚拟机中加载的类的数量;
[0021]根据最近预设多个周期获取的所述数量确定所述数量的增长率;
[0022]在所述增长率大于预设值时,确定具有溢出风险。
[0023]在本申请一实施例中,根据最近预设多个周期获取的所述数量确定所述数量的增长率,包括:
[0024]对最近预设多个周期获取的所述数量进行线性回归,得到所述数量随时间变化的增长率。
[0025]本申请的另一方面,还提供一种内存溢出监测装置,所述装置包括:监测模块,用于在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;第一确定模块,用于在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;第二确定模块,用于确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;第三确定模块,用于确定所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
[0026]在本申请一实施例中,还包括:
[0027]第四确定模块,用于确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
[0028]溢出定位模块,用于在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
[0029]本申请的另一方面,还提供一种电子设备,包括:处理器;以及存储程序的存储器,其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行本申请实施例的方法。
[0030]本申请的另一方面,还提供一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使计算机执行本申请实施例的方法。
[0031]本申请的有益效果为:
[0032]通过本申请的一个或多个实施例,监测并记录向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险时,确定近期加载的类名的固有部分及其对应的加载次数,能够得到近期加载的类名和加载次数;进一步的,确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名的固有部分及其对应的次数,能够得到确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名和加载次数。基于近期加载的类名及其加载次数和虚拟机中加载的所有类的类名及其加载次数,能够简单高效地对导致溢出的类进行监测。
附图说明
[0033]图1是本申请的一示例性实施例示出的一种内存溢出监测方法的流程图;
[0034]图2是本申请一实施例中示出的二维坐标的示意图;
[0035]图3是本申请一实施例中示出的类加载的生命周期的示意图;
[0036]图4为本申请一实施例示出的类加载器调用关系示意图;
[0037]图5是本申请一实施例示出的对ClassLoader的loadClass埋点插码的监控流程示意图;
[0038]图6是本申请一实施例示出的通过ClassFileTransformer的方式监控的流程示意图;
[0039]图7是本申请的一示例性实施例示出的一种内存溢出监测装置的结构图;
[0040]图8示出了能够用于实现本申请的实施例的示例性电子设备的结构框图。
具体实施方式
[0041]下面将参照附图更详细地描述本申请的实施例。虽然附图中显示了本申请的某些实施例,然而应当理解的是,本申请可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本申请。应当理解的是,本申请的附图及实施例仅用于示例性作用,并非用于限制本申请的保护范围。
[0042]应当理解,本申请的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本申请的范围在此方面不受限制。...

【技术保护点】

【技术特征摘要】
1.一种内存溢出监测方法,其特征在于,包括:在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;确定所述时间所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。2.根据权利要求1所述的内存溢出监测方法,其特征在于,还包括:确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。3.根据权利要求1所述的内存溢出监测方法,其特征在于,监测向虚拟机加载类,包括:监测类加载器的加载类方法;和/或监测字节码转换器的转换方法。4.根据权利要求1所述的内存溢出分析方法,其特征在于,确定类名的固有部分,并确定每个固有部分对应的加载次数,包括:对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。5.根据权利要求1所述的内存溢出监测方法,其特征在于,预测溢出风险的方法,包括:按照预设周期获取当前所述虚拟机中加载的类的数量;根据最近预设多个周期获取的所述数量确定所述数量的增长率;在所述增长率大于预设值时,确定具有溢出风险。6.根据权利要求5所述的内存溢出监测方法,其特征...

【专利技术属性】
技术研发人员:韦远奎
申请(专利权)人:北京基调网络股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1