CN116340102B - 一种内存溢出监测方法、装置、设备及存储介质 - Google Patents
一种内存溢出监测方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN116340102B CN116340102B CN202310316263.2A CN202310316263A CN116340102B CN 116340102 B CN116340102 B CN 116340102B CN 202310316263 A CN202310316263 A CN 202310316263A CN 116340102 B CN116340102 B CN 116340102B
- Authority
- CN
- China
- Prior art keywords
- class
- determining
- overflow
- inherent
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 238000012544 monitoring process Methods 0.000 title claims abstract description 46
- 238000011068 loading method Methods 0.000 claims abstract description 100
- 238000004590 computer program Methods 0.000 claims description 12
- 238000006243 chemical reaction Methods 0.000 claims description 7
- 238000012806 monitoring device Methods 0.000 claims description 7
- 230000004931 aggregating effect Effects 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 13
- 238000004891 communication Methods 0.000 description 9
- 230000006870 function Effects 0.000 description 8
- 230000007246 mechanism Effects 0.000 description 8
- 238000012545 processing Methods 0.000 description 7
- 238000012417 linear regression Methods 0.000 description 6
- 230000002776 aggregation Effects 0.000 description 5
- 238000004220 aggregation Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 238000004458 analytical method Methods 0.000 description 4
- 238000003780 insertion Methods 0.000 description 4
- 230000037431 insertion Effects 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 230000009466 transformation Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000002955 isolation Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000010267 cellular communication Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 230000000630 rising effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000011426 transformation method Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/301—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system is a virtual computing platform, e.g. logically partitioned systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/3037—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3051—Monitoring arrangements for monitoring the configuration of the computing system or of the computing system component, e.g. monitoring the presence of processing resources, peripherals, I/O links, software programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3409—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2201/00—Indexing scheme relating to error detection, to error correction, and to monitoring
- G06F2201/815—Virtual
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2201/00—Indexing scheme relating to error detection, to error correction, and to monitoring
- G06F2201/865—Monitoring of software
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Computer Hardware Design (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种内存溢出监测方法、装置、设备及存储介质,通过监控向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险的情况下,确定近期加载的类名的固有部分对应的加载次数、以及所有加载的类名的固有部分对应的次数。并基于近期加载的类名的固有部分对应的加载次数、以及加载的所有类的类名的固有部分对应的加载次数对溢出的类进行监测。本申请对于在类元数据空间溢出或者存在溢出风险时,可以简单高效地对导致溢出的类进行监测。
Description
技术领域
本申请属于内存管理技术领域,尤其涉及一种内存溢出监测方法、装置、设备及存储介质。
背景技术
Java虚拟机(Java Virtual Machine,简称为JVM)加载类的时候,记录类的元数据,简称为类元数据(Class Meta Data),这些数据会保存在一个单独的内存区域内,该内存区域称为类元数据空间。在Java 7里,这个空间被称为永久代(Permanent Generationspace,简称为PermGen或PermGenspace),在Java 8里,使用元空间(Metaspace)代替了永久代。
在实际应用中,可以设置类元数据空间的最大容量。在PermGen中称为PermSize和MaxPermSize。在Metaspace中称为MaxMetaspaceSize,用于限制本地内存分配给类元数据的大小。相关技术中,不论是PermGen还是Metaspace在遇到类元数据泄漏引发的内存溢出(out of memory,简称OOM)时,都难以进行对导致溢出的类加载进行监测。
发明内容
本申请提供了一种内存溢出监测方法、装置、设备及存储介质,以解决现有技术中难以对导致溢出的类进行监测的技术问题。
根据本申请的一方面,提供了一种内存溢出监测方法,包括:
在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;
在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;
确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
确定所述时间所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
在本申请一实施例中,还包括:
确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
在本申请一实施例中,监测向虚拟机加载类,包括:
监测类加载器的加载类方法;和/或
监测字节码转换器的转换方法。
在本申请一实施例中,确定类名的固有部分,并确定每个固有部分对应的加载次数,包括:
对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;
将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。
在本申请一实施例中,预测溢出风险的方法,包括:
按照预设周期获取当前所述虚拟机中加载的类的数量;
根据最近预设多个周期获取的所述数量确定所述数量的增长率;
在所述增长率大于预设值时,确定具有溢出风险。
在本申请一实施例中,根据最近预设多个周期获取的所述数量确定所述数量的增长率,包括:
对最近预设多个周期获取的所述数量进行线性回归,得到所述数量随时间变化的增长率。
本申请的另一方面,还提供一种内存溢出监测装置,所述装置包括:监测模块,用于在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;第一确定模块,用于在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;第二确定模块,用于确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;第三确定模块,用于确定所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
在本申请一实施例中,还包括:
第四确定模块,用于确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
溢出定位模块,用于在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
本申请的另一方面,还提供一种电子设备,包括:处理器;以及存储程序的存储器,其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行本申请实施例的方法。
本申请的另一方面,还提供一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使计算机执行本申请实施例的方法。
本申请的有益效果为:
通过本申请的一个或多个实施例,监测并记录向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险时,确定近期加载的类名的固有部分及其对应的加载次数,能够得到近期加载的类名和加载次数;进一步的,确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名的固有部分及其对应的次数,能够得到确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名和加载次数。基于近期加载的类名及其加载次数和虚拟机中加载的所有类的类名及其加载次数,能够简单高效地对导致溢出的类进行监测。
附图说明
图1是本申请的一示例性实施例示出的一种内存溢出监测方法的流程图;
图2是本申请一实施例中示出的二维坐标的示意图;
图3是本申请一实施例中示出的类加载的生命周期的示意图;
图4为本申请一实施例示出的类加载器调用关系示意图;
图5是本申请一实施例示出的对ClassLoader的loadClass埋点插码的监控流程示意图;
图6是本申请一实施例示出的通过ClassFileTransformer的方式监控的流程示意图;
图7是本申请的一示例性实施例示出的一种内存溢出监测装置的结构图;
图8示出了能够用于实现本申请的实施例的示例性电子设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本申请的实施例。虽然附图中显示了本申请的某些实施例,然而应当理解的是,本申请可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本申请。应当理解的是,本申请的附图及实施例仅用于示例性作用,并非用于限制本申请的保护范围。
应当理解,本申请的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本申请的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本申请中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本申请中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本申请实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
在Java中,动态代理、反射的使用动态生成类。动态类框架包括但不限于CCGLIB(Code Generation Library)、Groovy、bytebuddy等。
动态生成的类的类名与被增强的类的类名具有相同的部分,同时具有按照策略生成的部分。为了避免类名冲突,按照策略生成的部分通常是动态的(例如,随机生成的)。在本申请实施例中,动态生成的类的类名包括固有部分和动态部分。固有部分可为被增强的类的类名,动态部分为按照策略生成的部分。
每动态生成并加载一个类,类元数据空间中会存储相应的类元数据。错误的使用动态类框架动态生成并加载大量的类,将造成类加载泄漏。本申请实施例提供了一种内存溢出监测方法,能够对动态生成类导致的内存溢出进行监测。
图1示出了本申请实施例提供的内存溢出内存溢出监测方法的流程图,如图1所示,该方法包括步骤S110至步骤S140。
步骤S110,在监测到向虚拟机加载类的情况下,记录加载的类名。其中,对于动态生成的类,该类的类名包括动态部分和固有部分;
加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象。类的加载由类加载器(Class Loader)完成。作为一种实施方式,监测类加载器的类加载方法(loadClass),以获取加载的类名。
JVM的类加载采用双亲委派机制。所谓的双亲委派,是在加载类时,先让父类加载器试图加载该类,在父类加载器无法加载该类时,尝试从自己的类路径中加载该类。也就是说,某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;父加载器无法完成此加载任务时,自己去加载。
在一些情况下,应用本身破坏了双亲委派机制,类加载器的类加载方法被重写,改变这种机制的主要原因一般是为了做类加载隔离。为了监控这种破坏双亲委派机制的类加载器,可以通过JVM(Java Virtual Machine,JAVA虚拟机)的JVMTI(Java Virtual MachineTool Interface)技术对类加载器及子类的类加载方法进行埋点插码监控。
作为一种实施方式,通过增加JVMTI的字节码转换器(ClassFileTransformer)的转换方法(transform)来监控类的transform。
步骤S120,在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;
类元数据空间发生溢出可以是通过人工发现;当类元数据空间发生Metaspace相关的溢出故障时,可以观察近期加载的类看是否为类加载泄漏。通常类加载泄漏的场景是有规律的,类名上有一定的规则,比如:
com.xxx.txx.Class123_001
com.xxx.txx.Class123_002
com.xxx.txx.Class123_003
通常造成类加载泄漏的原因是错误地使用了动态类框架,如:Cglib、Groovy、bytebuddy等,对class的监控处理流程。
预测类元数据空间的溢出风险的方法可以包括步骤S121至步骤S123。
S121,按照预设周期获取当前所述虚拟机中加载的类的数量;
S122,根据最近预设多个周期获取的所述数量确定所述数量的增长率;
S123,在所述增长率大于预设值时,确定具有溢出风险。
通过预测的方式确定溢出风险,JVM的JMX(Java Management Extensions,Java管理扩展)提供了获取类统计的接口,可以通过getLoadedClassCount()获取多个时间点的类加载数量,如果类数量持续上涨,那么通过趋势分析是可以看出类加载泄漏倾向的,得出泄漏预测结果后再结合以上分析方法,可以自动得出分析结论。从而可以提前得到内存溢出风险预警,结合内存溢出监测,自动发现造成内存溢出风险的位置,以避免因难以定位溢出位置造成的内存运行故障。
在本申请一实施例中,根据最近预设多个周期获取的所述数量确定所述数量的增长率的过程可以包括步骤S12201。
步骤S12201,对最近预设多个周期获取的所述数量进行线性回归,得到所述数量随时间变化的增长率。
在本实施例中,可以将多个周期获取的所述数量映射至二维坐标系中,得到曲线,再对曲线进行线性回归处理,从而得到数量随时间变量的增长率。图2是本申请一实施例中示出的二维坐标的示意图,如图2所示,X轴为时间(t),Y轴为加载的Class数量(ClassCount)。曲线为随着时间推移类的数量变化,直线为对这些数据进行线性回归拟合出来的一条直线,这条直线的计算公式为Y=K*X+b;根据这个公式可以得出斜率K,通过判断K值的正负可以得出整体的类加载趋势。即正值代表溢出,0和负值代表正常。
因为拟合出来的直线会比较敏感,通常需要增加一个容错范围,这个范围的值需要根据实际情况进行调整。主要是控制正值的范围,比如斜率K在0-100为正常范围,斜率K大于100为异常(即判定存在溢出风险)。通过上述线性回归对曲线进行拟合,可以准确而快速地判定类加载是否在持续上涨,进而判断类元数据空间是否存在溢出风险。
步骤S130,确定该时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
对于动态生成并加载的类,监测和记录的类名包括固有部分和动态部分,通过固有部分可确定是对哪个类的增强,固有部分有利于定位对哪个类进行动态生成类。
作为一种实施方式,通过对类元数据空间发生溢出或预测到溢出风险之前预设时间范围内记录的类名进行聚合,以除去类名中的动态部分,得到类名的固有部分。
例如,在指定时间范围内,加载的类名包括:ClassA001、ClassA002、ClassA003、ClassA004、ClassA005、ClassA006、ClassA007、ClassA008、ClassB011、ClassB012、ClassB013、ClassB014、ClassB015、ClassB016、ClassB017。通过聚合得到,该指定时间范围内加载的类的固有部分包括:ClassA和ClassB。ClassA的出现次数为8,ClassB的出现次数为7,可确定得到该指定时间范围内ClassA的加载次数为8,ClassB的加载次数为7。
步骤S140,确定该时间所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
某一时间虚拟机中加载的所有类,是指在该时间虚拟机中加载的所有类,这些类可能在不同的时间点加载。某一时间虚拟机中加载的所有类,反映了虚拟机在该时间加载的类。作为一种实施方式,可通过JVMTI的getAllLoadedClasses()获得当前虚拟机加载的所有类的类名。
作为一种实施方式,通过对指定时间虚拟机中加载的所有类的类名进行聚合,能够得到该指定时间加载的类的固有部分及其对应的加载次数。
例如,在指定时间虚拟机中加载的所有类的类名包括:ClassA001、ClassA002、ClassA003、ClassA004、ClassA005、ClassA006、ClassA007、ClassA008、ClassB011、ClassB012、ClassB013、ClassB014、ClassB015、ClassB016、ClassB017。通过聚合得到,该指定时间指定时间虚拟机中加载的所有类的固有部分包括:ClassA和ClassB。ClassA的出现次数为8,ClassB的出现次数为7,可确定得到该指定时间范围内ClassA的加载次数为8,ClassB的加载次数为7。
通过步骤S130,确定得到近期(即类元数据空间发生溢出或预测到溢出风险之前预设时间范围)加载的类的固定部分(即,基于这些类进行动态生成类)及其加载次数。通过步骤S140,确定得到类元数据空间发生溢出或预测到溢出风险之时虚拟机中加载的所有类的固定部分及其加载次数。将两者结合能够定位到类元数据空间发生溢出或溢出风险的原因是否为基于这些类进行动态生成类。
在步骤S130中,作为一种实施方式,可以通过监测到向虚拟机加载类来确定该时间之前预设时间范围内记录的类名,监测到向虚拟机加载类可以包括:监测类加载器的加载类方法,和/或,监测字节码转换器的转换方法。
监测类加载器的加载类方法:
对ClassLoader的loadClass进行监控,ClassLoader的作用是将字节码形式的Class(类)文件加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的Class对象,作为方法区中类数据的访问入口。图3是本申请一实施例中示出的类加载的生命周期的示意图,如图3所示,类加载的生命周期包括:通过JAVA对相关文件进行编译(或者转换),得到字节码文件(.class),然后将字节码文件加载到JAVA虚拟机的Metaspace中,然后对Metaspace中的字节码文件进行验证、准备和解析(验证的作用是确保加载进来的字节码文件包含的信息符合虚拟机的要求;准备的作用是为类变量分配内存,设置类变量的初始值;解析的作用是将常量池的符号引用转为直接引用);然后对解析后的字节码文件进行初始化,然后便可以进行类文件的使用。使用完毕之后卸载类。
当JVM需要进行类加载时,会在当前ClassLoader上执行loadClass方法来加载类,当前ClassLoader会现在本地缓存寻找,如果没有会使用双亲委派机制向上级ClassLoader查找,如果这些ClassLoader都没有找到这个类,则由当前ClassLoader进行类加载。图4为本申请一实施例示出的类加载器调用关系示意图,如图4所示,类加载器的调用关系为:自定义类加载器(当前类加载器)向上级的System Classloader(***类加载器)查找,SystemClassloader向上级的Extension Classloader(扩展类加载器)查找,ExtensionClassloader向上级的Bootstrap Classloader(独立类加载器)查找。
但是在一些情况下,是应用本身破坏了双亲委派机制,ClassLoader的loadClass方法被重写,改变这种机制的主要原因一般是为了做类加载隔离。为了监控这种破坏双亲委派机制的ClassLoader,可以通过JVM的JVMTI技术对ClassLoader及子类的loadClass方法进行埋点插码监控,以得到加载的类名。
监测字节码转换器的转换方法:
通过增加JVMTI的ClassFileTransformer(字节码转换工具)来监控类的transform。在类加载之前需要将相关的.JAVA文件转换为.Class类文件,通过记录近期转换的类名(.Class文件的名称)来得到类名。
本实施例中,通过监控类加载方法或者类转换方法来对近期的加载的类名进行采集,在发现类元数据空间溢出或者存在溢出风险时,通过分析第一数据和第二数据来实现对导致溢出的类进行监测;类名的固有部分一般为业务类名,第一数据和第二数据由于确定了每种类名的固有部分的加载次数,因此第一数据和第二数据可以分别反映近期的类加载情况和总体的类加载情况。在发现类元数据空间溢出或者存在溢出风险时,基于第一数据和第二数据进行分析,可以对导致类元数据空间溢出的类进行监测。
图5是本申请一实施例示出的对ClassLoader的loadClass埋点插码的监控流程示意图,如图5所示,对类加载器进行埋点插码监控,通过类加载器的调用逻辑对当前类加载器的类加载动作进行监控,然后记录类名,并进行聚合统计,生成各种类名的频次,即可获得内存的近期类加载情况。
图6是本申请一实施例示出的通过ClassFileTransformer的方式监控的流程示意图,如图6所示,通过ClassFileTransformer工具直接记载类名,然后记录类名,并进行聚合统计,生成各种类名的频次,即可获得内存的近期类加载情况。
在本申请一实施例中,一种内存溢出监测方法还可以包括步骤S210至步骤S220。
步骤S210,确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
步骤S220,在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
作为一种实施方式,将第二数据中加载频次最高的N个固有部分对应的业务类作为导致元信息空间溢出的类,如果第一数据中加载频次最高的N个固有部分(即近期加载最多的N个类名的固有部分)与第二数据中加载频次最高的N个固有部分存在重合,那么就可以判定是该业务类持续加载,导致了类元数据空间的溢出。
上述分析过程通过将总体加载频次最高的N个业务类,与近期加载频率最高的N个业务类进行结合判断。如果近期加载频率高的(聚合后的)类和总体加载统计高的(聚合后的)类重合,那么导致当前类元数据空间Metaspace溢出的原因极大可能是因为这种动态类持续加载导致的。
在本申请一实施例中,确定类名的固有部分,并确定每个固有部分对应的加载次数的过程可以包括步骤S310至步骤S320。
步骤S310,对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;
步骤S320,将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。
在本实施例中,以使用动态类框架为例,动态类框架在每个业务类后随机生成动态部分,得到动态类,每个单独的动态类名均不相同。因此,为了对类名进行分类,需要对类名进行拆解,例如动态类名为“ClassA001、ClassA002、ClassA003、ClassA004、ClassA005、ClassA006、ClassA007、ClassA008、ClassB011、ClassB012、ClassB013、ClassB014、ClassB015、ClassB016、ClassB017”,在上述类名中,通过匹配关键字或者其他手段,可以将“ClassA”和“ClassB”作为固有部分提取出来。其他部分去除后,便完成了对类名的聚合。
先对类名进行聚合后,便可以得到每种固有部分对应的类名的加载次数,例如ClassA的出现次数为8,ClassB的出现次数为7,从而得到第一数据或者第二数据。
本申请中的一种内存溢出监测方法,通过监测并记录向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险时,确定近期加载的类名的固有部分及其对应的加载次数,能够得到近期加载的类名和加载次数;进一步的,确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名的固有部分及其对应的次数,能够得到确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名和加载次数。基于近期加载的类名及其加载次数和虚拟机中加载的所有类的类名及其加载次数,能够简单高效地对导致溢出的类进行监测。
如图7所示,本申请还提供一种内存溢出监测装置,所述装置包括:
监测模块710,用于在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;
第一确定模块720,用于在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;
第二确定模块730,用于确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
第三确定模块740,用于确定所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据。
在本申请一实施例中,还包括:
第四确定模块,用于确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
溢出定位模块,用于在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
在本申请一实施例中,所述监测模块包括:
第一监测单元,用于监测类加载器的加载类方法;和/或
第二监测单元,用于监测字节码转换器的转换方法。
在本申请一实施例中,第三确定模块或者第四确定模块包括:
聚类单元,用于对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;
统计单元,用于将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。
在本申请一实施例中,还包括:
定时获取模块,用于按照预设周期获取当前所述虚拟机中加载的类的数量;
增长率确定模块,用于根据最近预设多个周期获取的所述数量确定所述数量的增长率;
风险确定模块,用于在所述增长率大于预设值时,确定具有溢出风险。
在本申请一实施例中,增长率确定模块包括:
线性回归单元,用于对最近预设多个周期获取的所述数量进行线性回归,得到所述数量随时间变化的增长率。
本申请中的一种内存溢出监测装置,通过监测并记录向虚拟机加载的类名,并在类元数据空间发生溢出或预测到溢出风险时,确定近期加载的类名的固有部分及其对应的加载次数,能够得到近期加载的类名和加载次数;进一步的,确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名的固有部分及其对应的次数,能够得到确定发生溢出或预测到溢出风险时虚拟机中加载的所有类的类名和加载次数。基于近期加载的类名及其加载次数和虚拟机中加载的所有类的类名及其加载次数,能够简单高效地对导致溢出的类进行监测。
需要说明的是,上述实施例所提供的一种内存溢出监测装置与上述实施例所提供的一种内存溢出监测方法属于同一构思,其中各个模块和单元执行操作的具体方式已经在方法实施例中进行了详细描述,此处不再赘述。上述实施例所提供的一种内存溢出监测装置在实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能,本处也不对此进行限制。
本申请示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本申请实施例的方法。
本申请示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本申请实施例的方法。
本申请示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本申请实施例的方法。
参考图8,现将描述可以作为本申请的服务器或客户端的电子设备800的结构框图,其是可以应用于本申请的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本申请的实现。
如图8所示,电子设备800包括计算单元801,其可以根据存储在只读存储器(ROM)802中的计算机程序或者从存储单元808加载到随机访问存储器(RAM)803中的计算机程序,来执行各种适当的动作和处理。在RAM 803中,还可存储设备800操作所需的各种程序和数据。计算单元801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
电子设备800中的多个部件连接至I/O接口805,包括:输入单元806、输出单元807、存储单元808以及通信单元809。输入单元806可以是能向电子设备800输入信息的任何类型的设备,输入单元806可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元807可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元804可以包括但不限于磁盘、光盘。通信单元809允许电子设备800通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
计算单元801可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元801的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元801执行上文所描述的各个方法和处理。例如,在一些实施例中,一种内存溢出监测方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元808。在一些实施例中,计算机程序的部分或者全部可以经由ROM 802和/或通信单元809而被载入和/或安装到电子设备800上。在一些实施例中,计算单元801可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行一种内存溢出监测方法。
用于实施本申请的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本申请的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行***、装置或设备使用或与指令执行***、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体***、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
如本申请使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的***和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的***和技术实施在包括后台部件的计算***(例如,作为数据服务器)、或者包括中间件部件的计算***(例如,应用服务器)、或者包括前端部件的计算***(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的***和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算***中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将***的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机***可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
上述实施例仅示例性说明本申请的原理及其功效,而非用于限制本申请。任何熟悉此技术的人士皆可在不违背本申请的精神及范畴下,对上述实施例进行修饰或改变。因此,但凡所属技术领域中具有通常知识者在未脱离本申请所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本申请的权利要求所涵盖。
Claims (7)
1.一种内存溢出监测方法,其特征在于,包括:
在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;
在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;其中,预测溢出风险的方法,包括:按照预设周期获取当前所述虚拟机中加载的类的数量;根据最近预设多个周期获取的所述数量确定所述数量的增长率;在所述增长率大于预设值时,确定具有溢出风险;
确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
确定所述时间所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据;
确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
2.根据权利要求1所述的内存溢出监测方法,其特征在于,监测向虚拟机加载类,包括:
监测类加载器的加载类方法;和/或
监测字节码转换器的转换方法。
3.根据权利要求1所述的内存溢出监测方法,其特征在于,确定类名的固有部分,并确定每个固有部分对应的加载次数,包括:
对类名进行聚合以去除类名中的动态部分,得到类名的固有部分;
将每个固有部分对应的类名的出现次数作为该固有部分对应的加载次数。
4.根据权利要求1所述的内存溢出监测方法,其特征在于,根据最近预设多个周期获取的所述数量确定所述数量的增长率,包括:
对最近预设多个周期获取的所述数量进行线性回归,得到所述数量随时间变化的增长率。
5.一种内存溢出监测装置,其特征在于,所述装置包括:
监测模块,用于在监测到向虚拟机加载类的情况下,记录加载的类名,其中,至少部分所述类名包括动态部分和固有部分;
第一确定模块,用于在类元数据空间发生溢出或预测到溢出风险的情况下,确定发生溢出或溢出风险的时间;其中,预测溢出风险的方法,包括:按照预设周期获取当前所述虚拟机中加载的类的数量;根据最近预设多个周期获取的所述数量确定所述数量的增长率;在所述增长率大于预设值时,确定具有溢出风险;
第二确定模块,用于确定所述时间之前预设时间范围内记录的类名的固有部分,并确定每个固有部分对应的加载次数,得到第一数据;
第三确定模块,用于确定所述虚拟机中加载的所有类的类名的固有部分,并确定每个固有部分对应的加载次数,得到第二数据;
第四确定模块,用于确定所述第一数据中加载次数排在前N位的固有部分,以及所述第二数据中加载次数排在前N位的固有部分,其中N为正整数;
溢出定位模块,用于在所述第一数据和所述第二数据中加载次数排在前N位的固有部分相同时,将加载次数排在前N位的固有部分对应的类作为内存溢出原因。
6.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述电子设备实现如权利要求1至4中任一项所述的一种内存溢出监测方法。
7.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,当所述计算机程序被计算机的处理器执行时,使计算机执行权利要求1至4中任一项所述的一种内存溢出监测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310316263.2A CN116340102B (zh) | 2023-03-28 | 2023-03-28 | 一种内存溢出监测方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310316263.2A CN116340102B (zh) | 2023-03-28 | 2023-03-28 | 一种内存溢出监测方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116340102A CN116340102A (zh) | 2023-06-27 |
CN116340102B true CN116340102B (zh) | 2023-10-03 |
Family
ID=86883631
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310316263.2A Active CN116340102B (zh) | 2023-03-28 | 2023-03-28 | 一种内存溢出监测方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116340102B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103440161A (zh) * | 2013-08-15 | 2013-12-11 | 北京京东尚科信息技术有限公司 | 一种Java虚拟机内部对象监控方法、装置和*** |
CN108073441A (zh) * | 2016-11-14 | 2018-05-25 | 阿里巴巴集团控股有限公司 | 一种虚拟机内存监管方法与设备 |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控***及方法 |
CN114443418A (zh) * | 2021-12-24 | 2022-05-06 | 中国科学院软件研究所 | 一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置 |
CN114546590A (zh) * | 2022-02-18 | 2022-05-27 | 北京基调网络股份有限公司 | Java虚拟机堆内存集合对象监测方法及内存溢出分析方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9336018B2 (en) * | 2014-05-02 | 2016-05-10 | Oracle International Corporation | Mechanism for class data sharing using extension and application class-loaders |
-
2023
- 2023-03-28 CN CN202310316263.2A patent/CN116340102B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103440161A (zh) * | 2013-08-15 | 2013-12-11 | 北京京东尚科信息技术有限公司 | 一种Java虚拟机内部对象监控方法、装置和*** |
CN108073441A (zh) * | 2016-11-14 | 2018-05-25 | 阿里巴巴集团控股有限公司 | 一种虚拟机内存监管方法与设备 |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控***及方法 |
CN114443418A (zh) * | 2021-12-24 | 2022-05-06 | 中国科学院软件研究所 | 一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置 |
CN114546590A (zh) * | 2022-02-18 | 2022-05-27 | 北京基调网络股份有限公司 | Java虚拟机堆内存集合对象监测方法及内存溢出分析方法 |
Also Published As
Publication number | Publication date |
---|---|
CN116340102A (zh) | 2023-06-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111090536B (zh) | 一种获取内存泄露信息的方法、装置、介质和电子设备 | |
US8631401B2 (en) | Capacity planning by transaction type | |
JP5705084B2 (ja) | 2パス自動アプリケーション計測 | |
US7895483B2 (en) | Software memory leak analysis using memory isolation | |
US20070136402A1 (en) | Automatic prediction of future out of memory exceptions in a garbage collected virtual machine | |
US9043653B2 (en) | Introspection of software program components and conditional generation of memory dump | |
US7865901B2 (en) | Managing memory resident objects to optimize a runtime environment | |
CN109614227B (zh) | 任务资源调配方法、装置、电子设备及计算机可读介质 | |
US7010783B2 (en) | Method and apparatus for deployment of high integrity software using reduced dynamic memory allocation | |
US10102047B2 (en) | In-memory data analytic system that provides an integrated tracking mechanism for explicit memory resources | |
CN111488257A (zh) | 一种云服务链路跟踪监控方法、装置、设备及存储介质 | |
CN114116509A (zh) | 程序分析方法、装置、电子设备和存储介质 | |
US20200272441A1 (en) | Systems and methods for mapping software applications interdependencies | |
CN116340102B (zh) | 一种内存溢出监测方法、装置、设备及存储介质 | |
CN111966508A (zh) | 一种消息的批量发送方法、装置、计算机设备和存储介质 | |
CN116541069A (zh) | 关键函数评估方法、装置、电子设备、介质和程序产品 | |
WO2023016485A1 (zh) | 用于获取函数调用信息的方法、装置、电子设备和介质 | |
CN112860235B (zh) | 处理文本的方法、装置、设备和存储介质 | |
CN115687129A (zh) | 一种覆盖率报告生成方法、装置、存储介质和计算机设备 | |
CN115269431A (zh) | 一种接口测试方法、装置、电子设备及存储介质 | |
CN115048107A (zh) | 代码编译方法、***、电子设备及存储介质 | |
CN109634636B (zh) | 应用处理方法、装置、设备和介质 | |
EP4214605A1 (en) | Providing application error data for use by third-party library development systems | |
CN112783574A (zh) | 应用程序开发方法、装置、设备和存储介质 | |
CN112506781A (zh) | 测试监控方法、装置、电子设备、存储介质及程序产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |