内存溢出处理方法、装置、电子设备和存储介质
文献发布时间:2023-06-19 11:26:00
技术领域
本发明实施例涉及计算机应用技术领域,尤其涉及一种内存溢出处理方法、装置、电子设备和存储介质。
背景技术
伴随计算机技术的飞速发展,银行信息化程度越来越高,信息化系统投产版本越来越多,在系统的使用过程中,由于内存溢出导致的生产事件居多,其共同特点是虚拟机频繁GC(Garbage Collection,垃圾收集)或GC时间长,其共同的表现特征是交易响应时间变长,直至系统宕掉,这类生产事件给银行核心系统带来不利的影响。
目前采用通过系统功能测试、非功能测试来检测内存溢出问题,但是在测试过程中不能完全覆盖全部案例,所以仅依赖测试不能完全检测内存溢出问题。代码扫描系统也能扫描代码存在的内存溢出问题,但是依赖于扫描代码版本与投产代码版本的一致性,以及发现问题解决问题的及时性,并且代码扫描系统工作时需要将代码上传,而代码频繁的上传、扫描、整改及审核,会增加人力成本,同时也带来了代码的安全性问题。
发明内容
本发明实施例提供一种内存溢出处理方法、装置、电子设备和存储介质,以及时发现系统存在的内存溢出问题,降低内存溢出风险,提升投产系统代码的质量。
第一方面,本发明实施例提供了一种内存溢出处理方法,包括:
获取待检测系统的源码文件,并对所述源码文件进行解析得到语法树结构;
基于预先设置的内存溢出检测规则对所述语法树结构进行检测,得到存在内存溢出风险的目标树节点;
对所述目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
第二方面,本发明实施例还提供了一种内存溢出处理装置,包括:
源码解析模块,用于获取待检测系统的源码文件,并对所述源码文件进行解析得到语法树结构;
语法树检测模块,用于基于预先设置的内存溢出检测规则对所述语法树结构进行检测,得到存在内存溢出风险的目标树节点;
节点修复模块,用于对所述目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
第三方面,本发明实施例还提供了一种电子设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明任一实施例所述的内存溢出处理方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任一实施例所述的内存溢出处理方法。
本发明实施例通过对待检测系统的源码文件进行解析,得到语法树结构,通过对语法树结构进行检测,得到树结构中存在内存溢出风险的目标树节点,并对目标树节点进行修改,实现对源码文件进行内存溢出处理。本发明实施例可以准确检测出源码文件中可能存在存储溢出的代码结构,并针对性地对该代码结构进行修复,以进行内存溢出保护。并且本发明实施例可以在系统开发阶段随时进行检测,及时发现系统存在的内存溢出问题,降低内存溢出风险,提升投产系统代码的质量。
附图说明
图1是本发明实施例一中的内存溢出处理方法的流程图;
图2是本发明实施例二中的内存溢出处理方法的流程图;
图3是本发明实施例三中的内存溢出处理装置的结构示意图;
图4是本发明实施例四中的电子设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1是本发明实施例一中的内存溢出处理方法的流程图,本实施例可适用于投产系统的源码开发时进行内存溢出保护的情况。该方法可以由内存溢出处理装置来执行,该装置可以采用软件和/或硬件的方式实现,并可配置在电子设备中,例如电子设备可以是后台服务器等具有通信和计算能力的设备。如图1所示,该方法具体包括:
步骤101、获取待检测系统的源码文件,并对源码文件进行解析得到语法树结构。
其中,待检测系统是指需要进行内存溢出检测的开发系统,该系统可以处于开发阶段或者测试阶段,并且进行内存溢出检测时,该待检测系统可以处于非运行状态。内存溢出是指系统程序在申请内存时,系统没有足够的内存空间供其使用,导致内存溢出。源码文件是指待检测系统的程序源代码文件。语法树结构是指对系统源码的语法和语义结构进行表示的树形结构。其中,语法树结构中每一个树节点表征了源码中一个语法结构元素。
具体的,获取待检测系统的源码文件,对源码文件中的源代码进行词法分析,其中源代码是指一长串整行相连的字符串,词法分析把字符串形式的代码转换为令牌流,可将令牌看作是一个扁平的语法片段数组,词法分析得到的源码文件的单词排列,即由简短字符串构成的序列;再对单词排列进行语法分析,得到语法树结构,语法分析把一个令牌流转换成抽象语法树的形式,这个阶段会使用令牌中的信息把它们转换成一个抽象语法树的树结构。语法树结构每一层结构也被叫做节点。一个语法树结构可以由单一的节点或是成百上千个节点够成,通过组合在一起来描述静态分析的程序语法,静态分析是在不需要执行代码的前提下对代码进行分析的处理过程。
在一个可行的实施例中,对源码文件进行解析得到语法树结构,包括:
基于PSI对源码文件进行解析,得到第一语法树结构;
基于PMD对源码文件进行解析,得到第二语法树结构。
其中,PSI程序结构接口(Program Structure Interface,PSI),是IntelliJ平台中的一个层,负责解析文件并创建支持平台许多功能的语法和语义代码模型。PMD是一款Java程序代码检查工具,使用JavaCC生成解析器来解析源代码并生成抽象语法树(abstract syntax tree,AST),通过对AST的检查可以直接从源代码文本层面来对代码进行检查。
具体的,基于PSI层对源码文件进行解析,并创建支持IntelliJ平台许多功能的语法和语义代码模型,解析后的文件是一种树型结构,通过PsiViewer工具可以查看当前源码文件的PSI结构,即第一语法树结构。其中,PsiViewer是IntelliJ平台上的插件,通过该插件可以显示当前源码文件的PSI结构,选中任一PSI结构元素,也会显示该元素的详细信息。
为兼容eclipse开发工具,部分内存溢出检测规则通过PMD实现,PMD是一款静态代码扫描工具,使用JavaCC生成解析器来解析源代码并生成AST,即第二语法树结构。通过对AST的检查可以直接从源代码文本层面来对代码进行检查。AST是用编程语言编写的源代码的抽象语法结构的树表示,树的每个节点表示在源代码中出现的构造。语法是抽象的,不代表真实语法中出现的每个细节,而只是与结构、内容相关的细节。AST是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。
通过两种方法对源码文件的解析,得到两种语法树结构,实现对不同开发工具的兼容,进而提高内存溢出处理效率。
步骤102、基于预先设置的内存溢出检测规则对语法树结构进行检测,得到存在内存溢出风险的目标树节点。
其中,内存溢出检测规则是预先设置的对存在内存溢出风险的代码结构进行判断的标准,内存溢出检测规则包括至少两条。在一个可行的实施例中,内存溢出检测规则中至少包括如下一项:规则描述信息、错误提示信息以及规则显示级别信息。其中,规则描述信息用于描述该条内存溢出检测规则的具体检测内容;错误提示信息用于描述该条内存溢出检测规则将存在内存溢出风险的代码结构检测出后显示的内容,用于提示开发人员;规则显示级别信息用于表征该条内存溢出检测规则的优先级,通过设置规则显示级别信息便于开发人员提高对内存溢出风险的排查效率。示例性的,规则显示级别信息包括错误、警告和提示等,其中错误级别的优先级高于警告级别,警告级别的优先级高于提示级别。可以根据优先级确定对目标树节点的修复顺序。
具体的,针对每条内存溢出检测规则,通过分析源码文件对应的语法树结构,查找到不符合规范的代码所在的树节点,为存在内存溢出风险的目标树节点。示例性的,对于采用两种方式确定的第一语法树结构和第二语法树结构分别设置其关联的第一内存溢出检测规则和第二内存溢出检测规则。针对每条第一内存溢出检测规则,通过分析PSI结构,查找到不符合规范的代码所在的PSI元素,作为目标树节点;针对每条第二内存溢出检测规则,通过分析不规范源码对应的AST语法树,查找不符合规范的代码所在的树节点,作为目标树节点。
可选的,在确定目标树节点后,可以在控制台进行显示,以便开发人员进行查看。示例性的,对于IntelliJ平台,调用上下文的doInspections方法,执行规则扫描,将结果展示到控制台。
在一个可行的实施例中,该方法还包括:
根据内存溢出风险的共性特征,抽取内存溢出风险对应的代码特征;
对代码特征进行分类,并根据分类结果确定内存溢出检测规则。
针对系统生产时间中的共性问题进行分析,抽取导致内存溢出的代码问题,对问题进行分类,抽取不同的内存溢出检测规则。示例性的,在银行系统生产事件中,预先统计和确定内存溢出导致的生产事件的共性特征,并根据生产事件的共性特征确定对应的代码特征,再根据代码特征确定风险语法树结构,并根据该风险语法树结构制定相应的内存溢出检测规则。
通过对内存溢出风险的代码特征的抽取,提高了对内存溢出风险排查的覆盖范围,进而提高处理后代码的质量。
在一个可行的实施例中,分类结果包括访问对象分类结果,
相应的,根据分类结果确定内存溢出检测规则,包括:
根据访问对象分类结果设置不同的访问接口,通过访问接口实现内存溢出检测规则的具体实现。
按照访问对象的不同对代码特征进行分类,其中,访问对象是指代码中的执行对象。示例性的,访问对象包括类对象、方法调用表达式对象、新定义变量对象以及赋值表达式对象。在一个可行的实施例中,访问对象分类结果包括:类对象、方法调用表达式对象、新定义变量表达式对象和赋值表达式对象。
具体的,PSI和PMD采用了访问者模式,提供了多种visit接口,即访问接口,通过访问接口可只对传入的PSI结构或AST语法树及它的树节点代码进行访问,访问接口包括访问类对象(visitClass)、方法调用表达式对象(visitMethodCallExpression)、新定义变量对象(visitNewExpression)、赋值表达式对象(visitExpression)等,要检测的代码封装成解析的树型结构,以接口参数的形式传入。在实现的过程中,针对代码特征,可以调用不同的visit方法。
示例性的,在语义代码模型对应的语法树结构的辅助下,调用不同的visit方法进行业务逻辑判断,检测是否存在问题代码,例如,输入输出流是否调用close方法、读文件是否判断文件大小、程序是否显示调用gc方法等。对于返回的存在内存溢出风险的目标树节点信息,可调用PSI和PMD提供的错误信息注册接口,传入问题代码所在的树型元素、错误提示信息、错误级别等,将错误信息返回给控制台进行显示。
步骤103、对目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
确定存在内存溢出风险的目标树节点后,对目标树节点进行自动修复,修复完成后得到对源码文件进行内存溢出处理后的目标文件。其中,修复操作可以根据目标树节点存在内存溢出的类型进行针对性修复。示例性的,利用目标语法树结构集合中的修复树节点对目标树节点进行替换,目标语法树结构集合中即为调整了内存溢出风险逻辑的树节点构成的语法森林。在目标语法树结构集合中确定与目标树节点同类型同参数的树节点作为修复树节点。
在一个可行的实施例中,该方法还包括:
根据代码特征为每条内存溢出检测规则设置关联的修复方案。
由于代码特征中体现了出现内存溢出风险的漏洞,因此根据代码特征可以指定修复方案,以实现针对性对漏洞进行修补。示例性的,针对每条内存溢出检测规则的代码特征,确定关联的修复语法结构,作为关联的修复方案,以在进行修复时,使用关联的修复语法结构执行对该条内存溢出检测规则检测出的目标树节点的修复。
在一个可行的实施例中,对目标树节点进行修复,包括:
确定检测目标树节点关联的目标内存溢出检测规则,并确定与目标内存溢出检测规则关联的目标修复方案;
根据目标修复方案对目标树节点进行修复。
具体的,由于每条内存溢出检测规则具备其各自的修复方案,即不同的内存溢出检测规则对应的修复方案不同。因此在对目标树节点进行修复时,首先确定检测出该树节点存在内存溢出风险的内存溢出检测规则作为目标内存溢出检测规则,同时确定该目标内存溢出检测对应的目标修复方案,使用该目标修复方案对目标树节点进行修复即可实现针对性的内存溢出问题修复,提高内溢出保护的准确性和针对性。
在一个可行的实施例中,目标修复方案包括根据目标树节点的特征,在语法树结构中添加或修改目标树节点的子节点。
具体的,在对目标树节点对应的问题代码进行一键修复时,通过分析问题代码行所在的树型元素的特征,在树型结构中添加或修改子节点实现。具体的添加和修改方案可以根据实际代码逻辑进行确定,在此不作限定。
在一个可行的实施例中,每条内存溢出检测规则对应一个检测实现类;
相应的,基于预先设置的内存溢出检测规则对语法树结构进行检测,得到存在内存溢出风险的目标树节点,包括:
确定目标内存溢出检测规则对应的目标检测实现类;
将语法树结构以接口参数的形式传入目标检测实现类中,由目标检测实现类对语法树结构中的树节点进行检测,得到目标树节点。
每条内存溢出检测规则对应一个检测实现类。具体的,PMD的实现过程为将待扫描的文件和规则传入PMD,PMD将通过该文件的InputStream传递给由JavaCC生成的解析器,PMD从解析器取得指向抽象语法树的引用,每个规则检测实现类,根据传入的参数对AST节点进行检查。PSI实现过程与PMD类似,通过规则定位目标检测实现类,PSI将扫描的文件解析成特定的语义代码模型,通过对传入的参数PSI元素进行检查。
在一个可行的实施例中,确定目标内存溢出检测规则对应的目标检测实现类,包括:
若目标内存溢出检测规则为类对象检测规则,则调用类对象检测实现类对语法树中的类对象树节点进行检测;
若目标内存溢出检测规则为方法对象检测规则,则调用方法对象检测实现类对语法树中的方法对象树节点进行检测;
若目标内存溢出检测规则为新定义变量对象检测规则,则调用新定义变量对象检测实现类对语法树中的新定义变量对象树节点进行检测;
若目标内存溢出检测规则为赋值表达式对象检测规则,则调用赋值表达式对象检测实现类对语法树中的赋值表达式对象树节点进行检测。
每个内存溢出检测规则对应的检查对象不同,根据规则的特点,调用不同的visit方法,例如某些检查对象是方法调用visitMethodCallExpression、某些检查对象是新定义一个变量visitNewExpression等,visitMethodCallExpression是对类中的每一个方法调用进行检查、visitNewExpression是对类中每一个新定义的变量进行检查,visit方法的参数是树节点,根据业务逻辑,对参数树节点中代码进行判断。
在一个可行的实施例中,由目标检测实现类对语法树结构中的树节点进行检测,包括:
通过目标检测实现类确定检测对象树节点,并根据检测对象确定同类型的上下文节点信息,
根据检测对象树节点和上下文节点信息对检测对象树节点进行检测。
由于在对检测对象树节点进行检测时,需要获取到该检测对象树节点的上下文节点信息,通过结合上下文节点信息对该检测对象树节点进行检测,以提高检测准确性。示例性的,在上述实施例的基础上,由于visit方法的参数是树节点,根据业务逻辑对参数树节点中代码进行判断,在某些情况下需要获取代码的上下文,代码上下文通过参数树节点的getParentOfType或者findChildOfType方法获取,即获取与参数同类型的父节点或子节点。
本发明实施例通过对待检测系统的源码文件进行解析,得到语法树结构,通过对语法树结构进行检测,得到树结构中存在内存溢出风险的目标树节点,并对目标树节点进行修改,实现对源码文件进行内存溢出处理。本发明实施例可以准确检测出源码文件中可能存在存储溢出的代码结构,并针对性地对该代码结构进行修复,以进行内存溢出保护。并且本发明实施例可以在系统开发阶段随时进行检测,及时发现系统存在的内存溢出问题,降低内存溢出风险,提升投产系统代码的质量。
实施例二
图2是本发明实施例二中的内存溢出处理方法的流程图,本实施例二作为本发明的一个优选实施例。如图2所示,该方法包括:规则选取及级别配置、中英文语言切换、核心扫描程序、控制台结果展示和一键修复。
内存溢出问题是系统开发、测试和使用过程中都会遇到的问题,在开发阶段,开发人员一般情况下在遇到内存溢出时,才会通过log日志信息、GC日志分析解决问题,很少会主动测试发现内存溢出问题。在功能测试阶段,测试人员通过正案例、反案例对系统进行测试,测试的关注点是系统功能可用,反案例可能覆盖不全,测试出内存溢出的案例比较少。在非功能测试阶段,测试人员的关注点是系统的性能,例如响应时间、TPS(TransactionsPer Second,系统吞吐量)、高可用(停应用、宕机、宕网卡、进行挂起、服务一键启停、应用进程自我拉起)、系统容量、稳定性等,除此之外测试过程中也会进行GC分析、MAT(MemoryAnalyzer Tool,内存分析工具)结果分析,但是由于测试交易多、测试时间和人员紧张等原因,测试出内存溢出的案例比较少。
本发明实施例基于生产事件的共同特征,设计和实现一种内存溢出处理方法,及时发现及解决代码存在的内存溢出问题,提升投产代码质量,降低内存溢出风险。
该方法的主要步骤包括:
规则选取及级别配置:内存溢出检测规则和级别都有默认值,用户可以自定义需要扫描的内存溢出检测规则和以及规则的显示级别。其中,PSI和PMD都是通过xml文件进行配置,包括支持的语言、级别、规则显示名称及对应的规则实现类,不同之处是PSI规则的详细描述是html格式,PMD在xml文件的rule节点的example子节点中直接配置。
中英文语言切换:规则实现类根据需求获取相应的中英文信息,实现扫描时的中英文语言切换。
规则扫描:每条内存溢出检测规则对应一个检测实现类。PMD的实现过程为待扫描的文件和规则传入PMD,PMD将通过该文件的InputStream传递给由JavaCC生成的解析器,PMD从解析器取得指向抽象语法树的引用,每个规则检测实现类,根据传入的参数AST节点进行检查。PSI实现过程与PMD类似,通过规则定位实现类,PSI将扫描的文件解析成特定的语义代码模型,通过对传入的参数PSI元素进行检查。其中,每个规则对应的检查点,根据规则的特点,调用不同的visit方法,例如某些检查点是方法调用visitMethodCallExpression、某些检查点是新定义一个变量visitNewExpression等,visitMethodCallExpression是对类中的每一个方法调用进行检查、visitNewExpression是对类中每一个新定义的变量进行检查,visit方法的参数是树节点,根据业务逻辑,对参数树节点中代码进行判断,某些情况下需要获取代码的上下文,代码上下文通过参数树节点的getParentOfType或者findChildOfType方法获取,即获取某种类型的父节点或子节点。错误信息在控制台中显示,PMD通过调用addViolationWithMessage接口返回,PSI通过调用registerProblem接口将检测到的树节点返回。
控制台结果展示:对于IntelliJ平台,调用上下文的doInspections方法,执行规则扫描,将结果展示到控制台。上下文需要定义要扫描的规则和扫描范围。eclipse平台,完成一个菜单包括三个扩展点menus、commands和handlers,menus为菜单的扩展点,commands为行为扩展点,即声明一个行为操作,handlers为具体的行为操作扩展点,通过在handlers里执行execute方法,执行扫描规则,将结果展示到控制台。
一键修复:确定检测目标树节点关联的目标内存溢出检测规则,并确定与目标内存溢出检测规则关联的目标修复方案;根据目标修复方案对目标树节点进行修复。对于问题行一键修复,通过分析问题行所在的树型元素的特征,在树型结构中添加或修改子节点实现。
可选的,对于新增内存溢出检测规则实现接口或继承抽象类,配置xml信息实现自身扫描业务逻辑即可,代码整体架构不需要任何修改。
本发明实施例可以在不运行系统程序的情况下对系统源代码进行分析并定位问题所在行,PSI和PMD解析效率高,实现扫描速度快,操作简单,问题定位方便;并且实现在开发阶段执行扫描操作,提高代码质量、避免内存溢出事件,同时也避免了代码传输过程中的安全问题。
本发明实施例针对生产事件的共性问题进行分析,抽取导致内存溢出的代码问题,对问题进行分类,抽取不同的扫描规则,并为每条内存溢出检测规则提供修复方案。在开发阶段,随时对代码进行检测,及时发现问题解决问题。具有可扩展性,添加新的内存溢出检测规则只需要实现接口或继承抽象类,实现自身扫描业务逻辑即可,整体架构不需要任何修改。
实施例三
图3是本发明实施例三中的内存溢出处理装置的结构示意图,本实施例可适用于投产系统的源码开发时进行内存溢出保护的情况。如图3所示,该装置包括:
源码解析模块310,用于获取待检测系统的源码文件,并对所述源码文件进行解析得到语法树结构;
语法树检测模块320,用于基于预先设置的内存溢出检测规则对所述语法树结构进行检测,得到存在内存溢出风险的目标树节点;
节点修复模块330,用于对所述目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
本发明实施例通过对待检测系统的源码文件进行解析,得到语法树结构,通过对语法树结构进行检测,得到树结构中存在内存溢出风险的目标树节点,并对目标树节点进行修改,实现对源码文件进行内存溢出处理。本发明实施例可以准确检测出源码文件中可能存在存储溢出的代码结构,并针对性地对该代码结构进行修复,以进行内存溢出保护。并且本发明实施例可以在系统开发阶段随时进行检测,及时发现系统存在的内存溢出问题,降低内存溢出风险,提升投产系统代码的质量。
可选的,源码解析模块,具体用于:
基于PSI对所述源码文件进行解析,得到第一语法树结构;
基于PMD对所述源码文件进行解析,得到第二语法树结构。
可选的,所述装置还包括检测规则确定模块,包括:
特征抽取单元,用于根据内存溢出风险的共性特征,抽取内存溢出风险对应的代码特征;
特征分类确定单元,用于对所述代码特征进行分类,并根据分类结果确定内存溢出检测规则。
可选的,分类结果包括访问对象分类结果,
相应的,特征分类确定单元,具体用于:
根据访问对象分类结果设置不同的访问接口,通过所述访问接口实现内存溢出检测规则的具体实现。
可选的,所述访问对象分类结果包括:类对象、方法调用表达式对象、新定义变量表达式对象和赋值表达式对象。
可选的,所述装置还包括修复方案确定模块,用于:
根据所述代码特征为每条内存溢出检测规则设置关联的修复方案。
可选的,节点修复模块,具体用于:
确定检测所述目标树节点关联的目标内存溢出检测规则,并确定与所述目标内存溢出检测规则关联的目标修复方案;
根据所述目标修复方案对所述目标树节点进行修复。
可选的,所述目标修复方案包括根据所述目标树节点的特征,在所述语法树结构中添加或修改所述目标树节点的子节点。
可选的,每条内存溢出检测规则对应一个检测实现类;
相应的,语法树检测模块,包括:
实现类确定单元,用于确定目标内存溢出检测规则对应的目标检测实现类;
实现类检测单元,用于将所述语法树结构以接口参数的形式传入所述目标检测实现类中,由所述目标检测实现类对所述语法树结构中的树节点进行检测,得到目标树节点。
可选的,实现类确定单元,具体用于:
若所述目标内存溢出检测规则为类对象检测规则,则调用类对象检测实现类对所述语法树中的类对象树节点进行检测;
若所述目标内存溢出检测规则为方法对象检测规则,则调用方法对象检测实现类对所述语法树中的方法对象树节点进行检测;
若所述目标内存溢出检测规则为新定义变量对象检测规则,则调用新定义变量对象检测实现类对所述语法树中的新定义变量对象树节点进行检测;
若所述目标内存溢出检测规则为赋值表达式对象检测规则,则调用赋值表达式对象检测实现类对所述语法树中的赋值表达式对象树节点进行检测。
可选的,实现类检测单元,具体用于:
通过所述目标检测实现类确定检测对象树节点,并根据检测对象确定同类型的上下文节点信息,
根据所述检测对象树节点和所述上下文节点信息对所述检测对象树节点进行检测。
可选的,所述内存溢出检测规则中至少包括如下一项:规则描述信息、错误提示信息以及规则显示级别信息。
本发明实施例所提供的内存溢出处理装置可执行本发明任意实施例所提供的内存溢出处理方法,具备执行内存溢出处理方法相应的功能模块和有益效果。
将内存溢出处理装置以开发工具插件的形式提供给开发人员,安装和使用方便,开发人员可以在开发阶段,随时对代码进行检测,及时发现问题解决问题。
实施例四
图4是本发明实施例四提供的一种电子设备的结构示意图。图4示出了适于用来实现本发明实施方式的示例性电子设备12的框图。图4显示的电子设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图4所示,电子设备12以通用计算设备的形式表现。电子设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储装置28,连接不同系统组件(包括系统存储装置28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储装置总线或者存储装置控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
电子设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被电子设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储装置28可以包括易失性存储装置形式的计算机系统可读介质,例如随机存取存储装置(RAM)30和/或高速缓存存储装置32。电子设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图4未显示,通常称为“硬盘驱动器”)。尽管图4中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储装置28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储装置28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
电子设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该设备12交互的设备通信,和/或与使得该设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,电子设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图4所示,网络适配器20通过总线18与电子设备12的其它模块通信。应当明白,尽管图4中未示出,可以结合电子设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理单元16通过运行存储在系统存储装置28中的程序,从而执行各种功能应用以及数据处理,例如实现本发明实施例所提供的内存溢出处理方法,包括:
获取待检测系统的源码文件,并对所述源码文件进行解析得到语法树结构;
基于预先设置的内存溢出检测规则对所述语法树结构进行检测,得到存在内存溢出风险的目标树节点;
对所述目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
实施例五
本发明实施例五还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明实施例所提供的内存溢出处理方法,包括:
获取待检测系统的源码文件,并对所述源码文件进行解析得到语法树结构;
基于预先设置的内存溢出检测规则对所述语法树结构进行检测,得到存在内存溢出风险的目标树节点;
对所述目标树节点进行修复,得到对源码文件进行内存溢出处理后的目标文件。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个插件运行在开发工具上。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络包括局域网(LAN)或广域网(WAN)连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
- 内存溢出处理方法、装置、电子设备和存储介质
- 一种内存溢出管理方法、装置、电子设备及存储介质