掌桥专利:专业的专利平台
掌桥专利
首页

一种内存优化方法和系统

文献发布时间:2024-04-18 20:01:23


一种内存优化方法和系统

技术领域

本申请涉及应用程序技术领域,特别涉及一种内存优化方法和系统。

背景技术

内存是应用的基础性能治理要素之一,当应用程序使用过程中,随着使用内存的增加,可能导致卡顿、发烫等现象。另外操作系统针对应用程序使用的内存有一个上限阈值,一旦内存使用达到这个阈值,系统很有可能杀掉对应应用程序。

而当前没有有效调查内存场景的手段。通过应用程序的运行数据,只能知道当前版本应用程序的整体内存情况。但是无法定位具体问题,更难以确认修复效果。

发明内容

本申请的目的是提供一种内存优化方法,能够定位应用程序的内存异常并修复。

为解决上述技术问题,本申请提供一种应用程序的内存优化方法,具体技术方案如下:

采集所述应用程序的内存水位信息和内存节点信息;所述内存水位信息为所述应用程序在若干终端的平均占用内存值;

若所述内存水位信息中的占用内存超过预设阈值,确定所述应用程序的当前版本异常;

根据所述内存节点信息确定所述应用程序的异常页面,以及所述异常页面的操作路径和内存对象分布;

根据所述操作路径和所述内存对象分布修复对应的内存节点。

可选的,采集所述应用程序的内存水位信息和内存节点信息包括:

周期性采集所述应用程序的内存水位信息;所述内存水位信息包括当前页面、所述占用内存、可用内存、内存变化和操作路径中任一项或任意几项的组合;

在对象创建函数指针不为空时,记录内存节点信息;所述内存节点信息包括内存分配信息、页面信息、函数库信息和节点对象信息。

可选的,所述周期性采集所述应用程序的内存水位信息之后,还包括:

根据运行时间记录页面路径,确定用户操作路径。

可选的,根据运行时间记录页面路径,确定用户操作路径之后,还包括:

确定所述用户操作路径是否首次触发;

若为首次触发,判断当前内存占用是否满足内存阈值;

若是,上报所述用户操作路径。

可选的,所述在对象创建函数指针不为空时,记录内存节点信息包括:

在特定对象创建函数指针和系统对象创建函数指针均不为空时,通过所述特定对象创建函数指针和所述系统对象创建函数指针记录所述内存节点信息。

可选的,通过所述特定对象创建函数指针和所述系统对象创建函数指针记录所述内存节点信息时,还包括:

判断所述内存节点信息的操作类型;

若所述内存节点信息为开辟节点,记录新开辟节点;

若所述内存节点信息为释放节点,删除所述释放节点对应的记录。

可选的,所述在对象创建函数指针不为空时,记录内存节点信息后,还包括:

通过堆栈回溯捕获所述应用程序对应内存占用的虚拟地址,并利用哈希表存储所述虚拟地址;

将所述虚拟地址对应内存节点写入伸展树;其中,所述伸展树为用于存储内存数据的数据结构,且出现次数越多的内存节点越接近所述伸展树的顶端。

可选的,采集所述应用程序的内存水位信息和内存节点信息之后,还包括:

记录页面信息,建立所述页面信息与所述内存水位信息的关联关系。

可选的,所述采集所述应用程序的内存水位信息和内存节点信息之后,还包括:

将所述内存节点信息对应的内存对象符号化,并记录动态连接器镜像信息;所述动态链接器镜像信息用于在执行所述符号化确定相应的符号表地址。

本申请还提供一种内存优化系统,包括:

信息采集模块,用于采集所述应用程序的内存水位信息和内存节点信息;所述内存水位信息为所述应用程序在若干终端的平均占用内存值;

异常检测模块,用于若所述内存水位信息中的占用内存超过预设阈值,确定所述应用程序的当前版本异常;

异常分析模块,用于根据所述内存节点信息确定所述应用程序的异常页面,以及所述异常页面的操作路径和内存对象分布;

内存优化模块,用于根据所述操作路径和所述内存对象分布修复对应的内存节点。

本申请提供一种应用程序的内存优化方法,具体技术方案如下:采集所述应用程序的内存水位信息和内存节点信息;所述内存水位信息为所述应用程序在若干终端的平均占用内存值;若所述内存水位信息中的占用内存超过预设阈值,确定所述应用程序的当前版本异常;根据所述内存节点信息确定所述应用程序的异常页面,以及所述异常页面的操作路径和内存对象分布;根据所述操作路径和所述内存对象分布修复对应的内存节点。

本申请通过采集应用程序的内存水位信息和内存节点信息,对应用程序运行时内存进行监控和统计,通过设定预设阈值检测应用程序内存占用是否正常,同时分析内存节点信息,可以准确定位异常页面,以及其操作路径和内存对象分布,从而进行内存修复,能够有效定位内存异常并修复,优化内存修复效果。

本申请还提供一种内存优化系统,具有上述有益效果,此处不再赘述。

附图说明

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

图1为本申请实施例所提供的一种内存优化方法的流程图;

图2为本申请实施例所提供的伸展树的结构示意图;

图3为本申请实施例所提供的伸展树翻转后的结构示意图;

图4为本申请实施例所提供的一种内存优化系统结构示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

请参考图1,图1为本申请实施例所提供的一种内存优化方法的流程图,该方法包括:

S101:采集所述应用程序的内存水位信息和内存节点信息;所述内存水位信息为所述应用程序在若干终端的平均占用内存值;

S102:若所述内存水位信息中的占用内存超过预设阈值,确定所述应用程序的当前版本异常;

S103:根据所述内存节点信息确定所述应用程序的异常页面,以及所述异常页面的操作路径和内存对象分布;

S104:根据所述操作路径和所述内存对象分布修复对应的内存节点。

在应用程序运行后,采集应用程序的内存水位信息和内存节点信息。内存水位信息用于定位出现问题的场景和后续复现验证,而内存节点信息的采集主要用于分析场景的占用内存数据分布,定位到具体内存对象。

所谓内存水位信息,通常指根据若干终端上运行的应用程序时所占用的内存相关信息。为了降低运行过程中不同操作路径对于内存占用的影响,以及不同终端硬件配置对于内存占用的影响,可以周期性采集所述应用程序的内存水位信息,内存水位信息包括当前页面、所述占用内存、可用内存、内存变化和操作路径中任一项或任意几项的组合。容易理解的是,不同的页面元素不同,对于内存占用区别显著,例如视频播放页面比文本显示页面所占用的内存要高不少。在此对于采集的周期时间不作限定,可由本领域技术人员自定义设置,例如可以视为每5秒采集一次。

在一种可行的实施方式中,在采集所述应用程序的内存水位信息之后,还可以根据运行时间记录页面路径,确定用户操作路径。同时确定所述用户操作路径是否首次触发;若为首次触发,判断当前内存占用是否满足内存阈值,若满足内存阈值,上报用户操作路径。用户操作路径包含页面路径,以及每个页面路径的运行时间,意即处理何种数据,以及对应的运行时长。用户操作路径并不必须上报,仅在第一次触发至内存阈值上报。由于同一页面可能会多次显示,为了避免页面切换过程中内存回收不彻底,即页面多次触发导致的内存残留,可以设定内存阈值与页面触发次数的正相关。例如从800M开始,每次触发后增加100M。即初始内存阈值是800M,下一次触发时内存阈值变为900M。

同时,在步骤S101中,还需要采集内存节点信息。具体的,可在对象创建函数指针不为空时,记录内存节点信息。内存节点信息包括内存分配信息、页面信息、函数库信息和节点对象信息。在此对于对象创建函数指针不作具体限定,主要包含特定对象创建函数指针malloc_logger和系统对象创建函数指针syscall_logger。如此,可在特定对象创建函数指针和系统对象创建函数指针均不为空时,通过特定对象创建函数指针和系统对象创建函数指针记录所述内存节点信息。在对象创建函数指针均不为空时,内存的分配或者释放均通过对象创建函数指针通知上层,并通过对象创建函数指针记录内存分配信息,在此过程中,还可以补充页面信息、dyld_images信息和节点对应的对象信息,用于后续符号化分析,dyld_images信息为应用程序中的函数库。

特定对象创建函数指针malloc_logger,用于跟踪内存分配和释放的方法,它可以帮助开发者找到内存泄漏和其他内存相关问题。而系统对象创建函数指针syscall_logger是一种监测系统调用的函数方法。二者相同点在于都会记录每次malloc、free、calloc、realloc等内存操作,并记录分配和释放内存的堆栈信息。区别在于系统对象创建函数指针syscall_logger主要是系统调用。其中,malloc为动态内存分配函数,free为动态内存释放函数,calloc为动态内存分配并清零函数,realloc动态内存调整函数。

一种可行的实施方式中,在获取内存节点信息后,还可以进一步判断所述内存节点信息的操作类型。若内存节点信息为开辟节点,记录新开辟节点。若内存节点信息为释放节点,删除释放节点对应的记录。

在获取到内存水位信息和内存节点信息后,根据内存水位信息中的占用内存是否超过预设阈值判定应用程序是否存在异常。需要说明的是,该预设阈值与上文的内存阈值并不相同。上文内存阈值指应用程序中某个操作或某个页面的占用内存,而并非为应用程序的整体占用内存。本步骤中判定预设阈值则是根据应用程序的占用内存进行判定,且该占用内存并非源于少数终端上的内存占用数据,通常可根据若干终端上应用程序的内存占用数据的均值进行判定。此外,本实施例对于预设阈值的具体数值不作限定,可由本领域技术人员根据应用程序的测试数据或历史版本进行设定。

若确定应用程序的当前版本异常,可以根据内存节点信息中定位异常页面,并确定其操作路径和内存对象分布。由于内存异常占用可能为由于异常页面跳转导致,因此仅定位异常页面并不足以确定异常原因,因此,还需确定其操作路径,以检测是否为页面之间的异常跳转导致内存占用异常。而内存对象分布指的是当前应用程序中各对象对应的内存占用。该对象指操作对象,或为应用程序中各模块的内存占用分布。

确定异常页面的操作路径和内存对象分布后,即可根据操作路径和内存对象分布修复对应的内存节点。

在修复过程中,可以先根据获取的内存水位信息和内存节点信息进行分析。在分析过程中,主要包含根据内存变化信息确定异常页面中内存波动较大的页面作为可疑内存节点,此后获取这些可疑内存节点页面的操作路径,并进行操作路径复现,以确定异常点,并对异常点进行修复。

本申请实施例通过采集应用程序的内存水位信息和内存节点信息,对应用程序运行时内存进行监控和统计,通过设定预设阈值检测应用程序内存占用是否正常,同时分析内存节点信息,可以准确定位异常页面,以及其操作路径和内存对象分布,从而进行内存修复,能够有效定位内存异常并修复,优化内存修复效果。

在上述实施例的基础上,为了实现内存优化,一种可行的修复方式中,还可以通过堆栈回溯捕获应用程序对应内存占用的虚拟地址,并利用哈希表存储虚拟地址。再将虚拟地址对应内存节点写入伸展树。伸展树为用于存储内存数据的数据结构,且出现次数越多的内存节点越接近伸展树的顶端。如此,被调用次数越多的内存节点,其应用越频繁,其越接近伸展树的顶端,在后续调用时响应效率更高,避免由于内存调用不及时造成应用程序的内存占用上升。

伸展树为一种存放数据的方式。通常数据存储时会按照一定规则去存储数据,目的是为了加快读取时候速度。举例而言,有5个数作为学生的成绩:78、75、80、92、88。如果按照一定顺序去存储,比如75、78、80、88、92。那么就可以轻易获取最高分和最低分(此时只需要找第一个或者最后一个即可),若未按照顺序,则需要按照排序算法进行比对后方可获知最高分和最低分。在伸展树中,每次访问一个节点,这个节点都会被移到树的根部,这个操作称为"伸展",有助于在以后的搜索中更快地找到相同节点。伸展树的性能优点在于它通过伸展操作将最常用的节点放在树的顶部,从而提高了后续对这些节点的访问速度。在应用伸展树时,当监听到内存开辟时,与现有内存对象进行比对,若该内存对象已存在,则直接翻转内存对象。若发生内存开辟的对象为新内存对象,则在伸展树下添加新的内存对象。

参见图2和图3,图2为本申请实施例所提供的伸展树的结构示意图,图3为本申请实施例所提供的伸展树翻转后的结构示意图。图2中,包含了20、30、40、50和70五个内存对象,以伸展树的结构进行存储。若监听到30,则会翻转成如图3所示结构,将30移到伸展树的更上一层,如此随着树枝越来越多,伸展树越来越深,能保证伸展树的最上层为内存对象出现频率最高的几个对象。如此,在检测内存异常时,可以直接分析出现频率最高的几个内存对象,更容易发现内存异常所在。

在本申请的其他实施例中,采集所述应用程序的内存水位信息和内存节点信息之后,可以记录页面信息,建立所述页面信息与所述内存水位信息的关联关系。

还可以将所述内存节点信息对应的内存对象符号化,并记录动态连接器镜像信息。动态链接器镜像信息用于在执行所述符号化确定相应的符号表地址。动态连接器镜像信息即dyld_images信息,可记录每个镜像的加载信息。此外,还可以通过Hook alloc方法,记录内存对象的对象类型。

在其他实施方式中,可以对获取到的内存水位信息和内存节点信息进行落库。具体的,可以先进行内存归档,即定时对历史内存数据进行数据统计,当新版本的应用程序占总体版本数量超过设定百分比值时,即可以将内存水位信息和内存节点信息归档至MongoDB等数据库。

由于部分平台的应用市场仅在应用发布上线后有一定下载使用量后才可获取到新版本应用程序的用户使用数据,但该过程涉及灰度测试、应用程序送审、上线等流程,整个流程周期较长,也使得应用程序的内存反馈周期较长。为此,在经过内存归档后,可以提供内存水位信息和内存节点信息的实时查询,满足在应用程序的版本灰度期间即可分析版本内存数据,大大缩短了内存数据反馈的时间。进一步,为了保证查询速度,可以对终端上报的内存节点信息落库到ClickHouse。

下面对本申请实施例提供的一种内存优化系统进行介绍,下文描述的内存优化系统与上文描述的一种内存优化方法可相互对应参照。

参见图4,图4为本申请实施例所提供的一种内存优化系统结构示意图,本申请还提供一种内存优化系统,包括:

信息采集模块,用于采集所述应用程序的内存水位信息和内存节点信息;所述内存水位信息为所述应用程序在若干终端的平均占用内存值;

异常检测模块,用于若所述内存水位信息中的占用内存超过预设阈值,确定所述应用程序的当前版本异常;

异常分析模块,用于根据所述内存节点信息确定所述应用程序的异常页面,以及所述异常页面的操作路径和内存对象分布;

内存优化模块,用于根据所述操作路径和所述内存对象分布修复对应的内存节点。

基于上述实施例,作为优选的实施例,信息采集模块包括:

内存水位信息采集单元,用于周期性采集所述应用程序的内存水位信息;所述内存水位信息包括当前页面、所述占用内存、可用内存、内存变化和操作路径中任一项或任意几项的组合;

内存节点信息采集单元,用于在对象创建函数指针不为空时,记录内存节点信息;所述内存节点信息包括内存分配信息、页面信息、函数库信息和节点对象信息。

基于上述实施例,作为优选的实施例,信息采集模块还包括:

操作路径检测单元,用于根据运行时间记录页面路径,确定用户操作路径。

基于上述实施例,作为优选的实施例,信息采集模块还包括:

路径上报单元,用于确定所述用户操作路径是否首次触发;若为首次触发,判断当前内存占用是否满足内存阈值;若是,上报所述用户操作路径。

基于上述实施例,作为优选的实施例,内存节点信息采集单元为用于在特定对象创建函数指针和系统对象创建函数指针均不为空时,通过所述特定对象创建函数指针和所述系统对象创建函数指针记录所述内存节点信息。

基于上述实施例,作为优选的实施例,内存节点信息采集单元还包括:

节点类型检测单元,用于判断所述内存节点信息的操作类型;若所述内存节点信息为开辟节点,记录新开辟节点;若所述内存节点信息为释放节点,删除所述释放节点对应的记录。

基于上述实施例,作为优选的实施例,还包括:

内存优化单元,用于通过堆栈回溯捕获所述应用程序对应内存占用的虚拟地址,并利用哈希表存储所述虚拟地址;

将所述虚拟地址对应内存节点写入伸展树;其中,所述伸展树为用于存储内存数据的数据结构,且出现次数越多的内存节点越接近所述伸展树的顶端。

本申请还提供了一种计算机可读存储介质,其上存有计算机程序,该计算机程序被执行时可以实现上述实施例所提供的步骤。该存储介质可以包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

本申请还提供了一种电子设备,可以包括存储器和处理器,所述存储器中存有计算机程序,所述处理器调用所述存储器中的计算机程序时,可以实现上述实施例所提供的步骤。当然所述电子设备还可以包括各种网络接口,电源等组件。

说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例提供的系统而言,由于其与实施例提供的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

相关技术
  • 一种具有两条独立约束支链的四自由度并联机构
  • 存在两条连续转动轴线的四支链二自由度转动并联机构
技术分类

06120116552061