1.本公开涉及计算机
技术领域:
:,尤其涉及一种优化内存管理方法、装置、电子设备以及存储介质。
背景技术:
::2.在安卓系统场景中,如图1所示,安卓系统应用程序在运行模式为每个应用程序的进程启动一个虚拟机,虚拟机通过java本地接口(javanativeinterface,jni)访问本地环境,应用程序运行时所需内存可以分为java内存和本地(native)内存,其中,应用程序中动态库和虚拟机本身使用的内存都是本地内存。在上述进行使用内存时,通常依据内存分配器动态分配内存,具体的,内存分配器通过提供一系列申请内存或释放内存的函数接口,实现动态管理内存。3.在通过内存分配器进行内存管理时,往往出于全局配置的考虑,默认配置并不一定是最优的内存管理方案。由于内存分配器属于系统预置库,是以二进制的形式交付的,对外部调用者而言,只有可以调用的应用程序接口,诸如内存分配与释放的细节,调用者都无法干预。4.在相关技术中,可采用基于过程链接表钩子函数(procedurelinkagetablehook,plthook)中的mallochook函数方案优化内存分配器,即通过修改全局偏移量表(globaloffsettable,got)的方式来实现函数拦截替换,但是此方案只能接管个别库的内存管理,且此方案只记录了内存管理,没有实现内存释放的逻辑,没有形成一个完整的内存分配器应该支持的功能的全集。具体的,在通过该方案进行优化内存管理器的过程中,只是对内容分配函数进行拦截记录,真正的内存管理的实现还是通过转发给预置系统库完成的,并且仅能拦截个别动态库,并且只能拦截在got中导出的函数。5.因此,上述优化内存分配器的方案,不能全权接管内存的分配和管理,动态分配内存的性能较差。技术实现要素:6.本公开提供一种优化内存管理方法、装置、电子设备以及存储介质,以至少解决相关技术中,优化内存分配器的方式不能全权接管内存的分配和管理的问题。本公开的技术方案如下:7.根据本公开实施例的第一方面,提供一种优化内存管理方法,包括:获取第一内存管理函数的第一函数地址,第一内存管理函数为系统内存管理函数;将第一函数地址对应的内存权限设置为写权限;将第一函数地址替换为第二内存管理函数的第二函数地址,第二内存管理函数为预置内存管理函数;通过第二函数地址,调用第二内存管理函数以动态分配内存。8.可选的,上述“获取第一内存管理函数的第一函数地址”,包括:在第一内存管理函数为系统库的导出函数的情况下,将使用动态加载库加载以目标字符为后缀的函数库时为第一内存管理函数分配的地址,确定为第一函数地址;在第一内存管理函数不为系统库的导出函数的情况下,在当前进程内存映射区域内与第一内容分配函数的函数名称相匹配的地址,确定为第一函数地址。9.可选的,上述“将第一函数地址替换为第二内存管理函数的第二函数地址”,包括:在内联挂钩指令集合中,查找替换指令,替换指令为用于替换函数地址的指令;根据替换指令,将第一函数地址替换为第二内存管理函数的第二函数地址。10.可选的,上述优化内存管理方法还包括:将第一函数地址替换为第二内存管理函数的第二函数地址之后,采用预置函数,清除缓存中的第一函数地址,将第一函数地址对应的内存权限设置为只读权限。11.可选的,上述优化内存管理方法还包括:获取第一内存管理函数的第一函数地址之前,根据第一内存管理函数的函数功能,生成第二内存管理函数;其中,函数功能包括以下至少一项:内存分配、内存释放、内存块分配、内存对齐分配。12.可选的,上述优化内存管理方法还包括:将第一函数地址替换为第二内存管理函数的第二函数地址之后,抓取用于释放已分配内存的目标内存管理函数,目标内存管理函数为第一内存管理函数或第二内存管理函数;在目标内存管理函数为第一内存管理函数的情况下,在第一内存管理函数对应的堆内存区域内释放内存空间;在目标内存管理函数为第二内存管理函数的情况下,在第二内存管理函数对应的堆内存区域内释放内存空间。13.可选的,上述优化内存管理方法还包括:抓取用于释放已分配内存的目标内存管理函数之后,基于目标内存管理函数对应的动态树长度,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数;或,基于目标内存管理函数中待释放内存的指针标记,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数。14.根据本公开实施例的第二方面,提供一种优化内存管理装置,包括:获取单元、设置单元、替换单元以及调用单元;获取单元,用于获取第一内存管理函数的第一函数地址,第一内存管理函数为系统内存管理函数;设置单元,用于将获取单元获取的第一函数地址对应的内存权限设置为写权限;替换单元,用于将获取单元获取的第一函数地址替换为第二内存管理函数的第二函数地址,第二内存管理函数为预置内存管理函数;调用单元,用于通过替换单元替换的第二函数地址,调用第二内存管理函数以动态分配内存。15.可选的,上述获取单元,用于:在第一内存管理函数为系统库的导出函数的情况下,将使用动态加载库加载以目标字符为后缀的函数库时为第一内存管理函数分配的地址,确定为第一函数地址;在第一内存管理函数不为系统库的导出函数的情况下,在当前进程内存映射区域内与第一内容分配函数的函数名称相匹配的地址,确定为第一函数地址。16.可选的,上述替换单元,用于:在内联挂钩指令集合中,查找替换指令,替换指令为用于替换函数地址的指令;根据替换指令,将第一函数地址替换为第二内存管理函数的第二函数地址。17.可选的,上述优化内存管理装置还包括处理单元;处理单元,用于替换单元将第一函数地址替换为第二内存管理函数的第二函数地址之后,采用预置函数,清除缓存中的第一函数地址,将第一函数地址对应的内存权限设置为只读权限。18.可选的,上述优化内存管理装置还包括生成单元;生成单元,用于获取单元获取第一内存管理函数的第一函数地址之前,根据第一内存管理函数的函数功能,生成第二内存管理函数;其中,函数功能包括以下至少一项:内存分配、内存释放、内存块分配、内存对齐分配。19.可选的,上述优化内存管理装置还包括抓取单元和释放单元;抓取单元,用于替换单元将第一函数地址替换为第二内存管理函数的第二函数地址之后,抓取用于释放已分配内存的目标内存管理函数,目标内存管理函数为第一内存管理函数或第二内存管理函数;释放单元,用于在抓取单元抓取的目标内存管理函数为第一内存管理函数的情况下,在第一内存管理函数对应的堆内存区域内释放内存空间;释放单元,还用于在抓取单元抓取的目标内存管理函数为第二内存管理函数的情况下,在第二内存管理函数对应的堆内存区域内释放内存空间。20.可选的,上述优化内存管理装置还包括判断单元;判断单元,用于抓取单元抓取用于释放已分配内存的目标内存管理函数之后,基于目标内存管理函数对应的动态树长度,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数;判断单元,还用于抓取单元抓取用于释放已分配内存的目标内存管理函数之后,基于目标内存管理函数中待释放内存的指针标记,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数。21.根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为执行上述指令,以实现如第一方面及其任一种可能的设计方式所提供的优化内存管理方法。22.根据本公开实施例的第四方面,提供一种可读存储介质,当可读存储介质中的指令被处理器执行时,能够实现如第一方面及其任一种可能的设计方式所提供的优化内存管理方法。23.根据本公开实施例的第五方面,提供一种计算机程序产品,包括计算机程序/指令,计算机程序/指令被处理器执行时实现如第一方面及其任一种可能的设计方式所提供的优化内存管理方法。24.本公开提供的技术方案至少带来以下有益效果:首先获取第一内存管理函数的第一函数地址,然后将第一函数地址对应的内存权限设置为写权限,再将第一函数地址替换为第二内存管理函数的第二函数地址,最后通过第二函数地址,调用第二内存管理函数以动态分配内存。如此,在运行时动态分配内存,以使得在管理内存时不再局限于系统库分配内存的限制,能够在进程内根据实际运行情况和需求动态分配和管理内存,优化内存的申请和释放性能和内存使用性能。即,能够降低内存占用,使用更少的内存完成同样的内存申请与释放需求,还能够提升内存分配与释放性能,提高内存分配和释放速度,还能够提高内存使用效率,提高内存访问速率。25.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。附图说明26.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。27.图1是根据一示例性实施例示出的一种安卓系统应用程序在运行模式为每个应用程序的进程启动的示意图;28.图2是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之一;29.图3是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之二;30.图4是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之三;31.图5是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之四;32.图6是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之五;33.图7是根据一示例性实施例示出的一种优化内存管理方法的流程示意图之六;34.图8是根据一示例性实施例示出的一种优化内存管理方法的函数对应关系示意图;35.图9是根据一示例性实施例示出的一种优化内存管理装置的框图;36.图10是根据一示例性实施例示出的一种电子设备的结构示意图。具体实施方式37.为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。38.需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。39.另外,在本公开实施例的描述中,除非另有说明,“/”表示或的意思,例如,a/b可以表示a或b。本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,在本公开实施例的描述中,“多个”是指两个或多于两个。40.为了优化内存分配器,可以采用基于系统最高开放权限root环境下的环境变量ld_preload方案,该方案可以完整的替换整个内存分配器,但是适用环境有限只能在root环境下使用,用户购买的电子产品通常不会开放root环境,不具备优化内存分配的环境。再者,该方案只能从整个进程一开始就执行替换,不能动态实时更替。导致该方案能够优化的程序有限。41.为了优化内存分配器,还可以采用基于换行脚本wrap.sh的内存泄露malloc_debug方案,该方案一是使用环境有限,只能调式环境使用包debug包使用,二是功能有限,只能获取内存分配与释放的信息,并没有实现完整的内存分配器的功能,三是进程运行,导致该方案能够优化的程序有限。42.下面结合附图,对本公开实施例提供的优化内存管理方法进行描述,下面以执行主体为优化内存管理装置为例对该方法进行示例性说明。图2为本公开实施例提供的优化内存管理方法的流程示意图。如图2所示,本公开实施例提供的优化内存管理方法包括下述步骤201至步骤204。43.步骤201、优化内存管理装置获取第一内存管理函数的第一函数地址。44.在本公开实施例中,第一内存管理函数为系统内存管理函数。需要说明的是,在冯诺依曼体系下,内存分为栈内存和动态分配内存两种,栈内存不灵活,动态内存分配使用更为普遍。可以采用内存管理器,实现动态分配内存。第一内存管理函数属于内存管理器,内存管理器承担动态分配内存的职责,能够提供一系列申请内存或释放内存的函数接口,来实现动态内存管理功能。第一内存管理函数与函数接口对应,第一内存管理函数用于实现内存管理的具体实现过程,函数接口用于调用第一内存管理函数。45.在本公开实施例中,调用第一内存管理函数动态分配内存,即,根据第一内存管理函数对应的第一函数地址保存的程序文件进行动态分配内存。因此,为了优化内存管理,需要可以更改第一函数地址对应的程序文件,或者改变第一函数地址调用第二内存管理函数。46.可选的,在本公开实施例中,如图3所示,步骤201可以通过步骤301和步骤302实现。47.步骤301、优化内存管理装置在第一内存管理函数为系统库的导出函数的情况下,将使用动态加载库加载以目标字符为后缀的函数库时为第一内存管理函数分配的地址,确定为第一函数地址。48.步骤302、优化内存管理装置在第一内存管理函数不为系统库的导出函数的情况下,在当前进程内存映射区域内与第一内容分配函数的函数名称相匹配的地址,确定为第一函数地址。49.在本公开实施例中,第一内存管理函数虽然属于系统库,由于其实现方法的不同,可以通过第一内存管理函数是否为系统库的导出函数,采用不同的方法确定第一函数地址。50.示例性的,目标字符可以为so。在函数库的后缀为so的情况下,能够指示第一内存管理函数所属的函数库集合能够实现某特定功能。51.本公开提供的技术方案至少带来以下有益效果:根据第一内存管理函数的特点,采用不同方案确定第一函数地址,使得第一函数地址更准确,以便于提高优化内存管理的成功率。52.s202、优化内存管理装置将第一函数地址对应的内存权限设置为写权限。53.在本公开实施例中,第一函数地址对应的内存权限默认为只读权限,以避免由于修改第一函数地址造成不可调用第一内存管理函数的情况,以保证内存管理器能动态分配内存。54.在本公开实施例中,优化内存管理装置对内存管理方式进行优化的过程中,将第一函数地址对应的内存权利设置为写权限,开放第一函数地址的修改状态,为优化内存管理提供修改时机,即,只有在第一函数第一对应的内存权限为写权限时,才能实现优化内存管理。55.s203、优化内存管理装置将第一函数地址替换为第二内存管理函数的第二函数地址。56.在本公开实施例中,第二内存管理函数为预置内存管理函数。第二内存管理函数是根据第一内存管理函数(系统内存管理函数),编写的用于实现内存管理的函数,如实现内存分配、内存释放等等。57.可以理解的是,由于内存分配器是底层的基础软件,对于安卓平台而言,内存分配器内置于系统c库,应用程序运行时依赖的所有系统库,如虚拟机库文件libart.so、页面渲染库文件libhwui.so,及应用程序本身的开发代码都会依赖系统c库,此种依赖方式是开发者无法直接修改第一内存管理函数,只能重新编写第二内存管理函数,用于实现以内存管理函数的功能。58.可选的,在本公开实施例中,如图4所示,步骤203可以通过步骤401和步骤402实现。59.步骤401、优化内存管理装置在内联挂钩指令集合中,查找替换指令。60.步骤402、优化内存管理装置根据替换指令,将第一函数地址替换为第二内存管理函数的第二函数地址。61.在本公开实施例中,替换指令为用于替换函数地址的指令。内联挂钩指令集合中存储的指令,属于中央处理器cpu级别的技术,能够拦截系统库函数。因此,通过替换指令,能够将第一函数地址替换为第二函数地址。62.在本公开实施例中,在进行函数拦截替换的过程中,对所有业务接入方来说替换方式是透明的,即,代码无需重新编译,仍使用编译时链接的第一内存管理函数(用于分配和释放内存),只是在运行时被替换。63.本公开提供的技术方案至少带来以下有益效果:由于第一函数地址对应的第一内存管理函数属于系统库函数,因此,通过内联挂钩指令集合中替换指令才能地址替换,以使得能够根据第二内存管理函数进行内存分配。64.s204、优化内存管理装置通过第二函数地址,调用第二内存管理函数以动态分配内存。65.在本公开实施例中,调用第二内存管理函数是指在运行时进行动态内存分配,即,在启东进程、采集内存信息或者内存占用超过阈值时,均可以调用第二内存管理函数以动态分配内存。66.可选的,在本公开实施例中,如图5所示,本步骤204可以通过下述步骤501至步骤503实现。67.步骤501、优化内存管理装置抓取用于释放已分配内存的目标内存管理函数。68.步骤502、优化内存管理装置在目标内存管理函数为第一内存管理函数的情况下,在第一内存管理函数对应的堆内存区域内释放内存空间。69.步骤503、优化内存管理装置在目标内存管理函数为第二内存管理函数的情况下,在第二内存管理函数对应的堆内存区域内释放内存空间。70.在本公开实施例中,目标内存管理函数为第一内存管理函数或第二内存管理函数。需要说明的是,释放内存又可以称为内存转发。根据目标内存管理函数是第一内存管理函数还是第二内存管理函数,在对应的堆内存区域内释放内存空间。71.在本公开实施例中,对系统内存分配函数的拦截替换,还需要注意时机,即在应用程序进程运行什么阶段执行替换。理想状态下,进程启动的第一瞬间就执行替换,这样的替换最彻底,但是现实情况下,一是系统平台并不存在开发者可控的主函数main入口,二是即使在主函数main入口执行替换,依然存在预执行阶段的内存分配时无法拦截替换的。在此基础上,如果只将第一内存管理函数替换为第二内存管理函数,并不能实现真正的替换,因为无法在第一时间执行彻底替换,存在少量内存分配在预执行阶段由第一内存管理函数分配的,如果直接对此部分内存执行简单的释放替换,那么会导致系统崩溃,需要将此部分内存由系统分配器释放。72.本公开提供的技术方案至少带来以下有益效果:区分第一内存管理函数与第二内存管理函数对应的堆内存区域,并在对应区域内释放内存空间,以便于更好地管理内存空间。73.进一步可选的,在本公开实施例中,上述步骤501之后还包括以下任一项:基于目标内存管理函数对应的动态树长度,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数;基于目标内存管理函数中待释放内存的指针标记,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数。74.在本公开实施例中,对于基于目标内存管理函数对应的动态树长度的方式,即需要根据内置数据结构判断内存管理方案,即,查询已分配内存的内存块的数据结构,判断以分配内存的内存块是否为第一内存管理函数分配的。75.示例性的,已分配内存的内存块的单位是逻辑单位extent,管理extent的结构是空间数据索引rtree;如果上述已分配内存是第二内存管理函数分配的,那么在第二内存管理函数中存在对应的extent;在rtree中查询当前地址是否存在上述extent,如果存在则上述已分配内存是第二内存管理函数分配的,如果不存在则上述已分配内存是第一内管理函数(系统内存分配函数)分配的。76.在本公开实施例中,对于64位体系结构的处理器你,实际有效的寻址空间小于264,可能实际使用的只有低48位,高8位都是0,因此,cpu进行虚拟地址与物理地址转换时,可以忽略高8位的值。上述指针标记可以存储在高8位,示例性的,用0x55给所有的第二内存管理函数分配的内存打上标记,上释放内存判断高8位信息是否为0x55。77.本公开提供的技术方案至少带来以下有益效果:设置多种判断目标内存管理函数为第一内存管理函数还是第二内存管理函数,以便于根据一种判断方式不足以得到判断结果时,还可以根据另一种判断方式进行判断,以确保能够得到目标内存管理函数为第一内存管理函数还是第二内存管理函数的判断结果。78.在本公开实施例中,通过将第一函数地址替换为第二函数地址,以及,通过第二函数地址,调用第二内存管理函数以动态分配内存,两个步骤实现函数的拦截和替换,能够实现优化内存管理的高效性。79.本公开提供的技术方案至少带来以下有益效果:首先获取第一内存管理函数的第一函数地址,然后将第一函数地址对应的内存权限设置为写权限,再将第一函数地址替换为第二内存管理函数的第二函数地址,最后通过第二函数地址,调用第二内存管理函数以动态分配内存。如此,在运行时动态分配内存,以使得在管理内存时不再局限于系统库分配内存的限制,能够在进程内根据实际运行情况和需求动态分配和管理内存,优化内存的申请和释放性能和内存使用性能。即,能够降低内存占用,使用更少的内存完成同样的内存申请与释放需求,还能够提升内存分配与释放性能,提高内存分配和释放速度,还能够提高内存使用效率,提高内存访问速率。80.可选的,为了保持内存管理稳定性,在图2的基础上,如图6所示,在步骤204之后,本公开实施例提供优化内存管理方法,还包括下述步骤601。81.步骤601、优化内存管理装置采用预置函数,清除缓存中的第一函数地址,将第一函数地址对应的内存权限设置为只读权限。82.在本公开实施例中,预置函数可以为编译器builtin函数中的clear_cache函数。需要说明的是,builtin函数是一系列编译器预置的函数,属于非c语言标准款内容,与硬件联系紧密,执行效率高。83.在本公开实施例中,缓存是指中央处理器cpu芯片上的高速缓存,缓存与cpu寄存器一样由逻辑门电路组成,具有访问速度快的特点,访问速度远高于访问内存的速度。在计算机体系结构中,由于cpu运行速度远高于内存运行速度,且程序访存具有局部性特点,为了平衡二者之间的速度差异,设计缓存电路保存部分内存地址的值。当cpu读取内存时,优先从缓存中读取,当缓存中不存在访问内存地址时,再从内存中读取。84.在本公开实施例中,通过预置函数清除缓存中的第一函数地址,即,预置函数执行清理cpu缓存,使得再次访问函数地址时,强行绕过缓存,只从内存中读取。85.可选的,在预置函数clear_cache中的传参代表只清理16字节,执行此函数的目的是为了保持cpu读取内存的一致性,避免存在部分执令从缓存中读取,而另外一份执令又从内存中读取的情况。如果产生此中情况,会有未定义的现象发生,如,系统崩溃现象。86.本公开提供的技术方案至少带来以下有益效果:通过清除缓存中的第一函数地址,使得在访问时只能调用第二函数地址对应的第二内存管理函数,以确保调用自定义的第一内存管理函数进行内存分配和管理。87.可选的,为了保持内存管理稳定性,在图2的基础上,如图7所示,在步骤201之前,本公开实施例提供优化内存管理方法,还包括下述步骤701。88.步骤701、优化内存管理装置根据第一内存管理函数的函数功能,生成第二内存管理函数。89.在本公开实施例中,函数功能包括以下至少一项:内存分配、内存释放、内存块分配、内存对齐分配。需要说明的是,由于第一内存管理函数是以二进制形式交付的,对外部调用者而言,只有可以调用的函数调用接口,诸如内存分配与释放的细节,调用者无法干预,换而言之,无法在第一内存管理函数的基础上进行深度定制,只能接收第一内存管理函数,或者重新编写能够实现第一内存管理函数的函数功能的第二内存管理函数。90.还需要说明的是,上述函数功能可以对应5个函数调用接口,如,malloc、free、realloc、memalign和posix_memalign。91.在本公开实施例中,内存分配函数是用户态程序函数,用于管理内存的动态分配和释放。第二内存管理函数用于实现开发者自定义的内存动态分配与释放规则。需要说明的是,操作系统平台不提供系统内存分配的方法,无法使用系统内存分配函数以外的其他内存分配函数来实现关联动态内存分配与释放的功能。92.在本公开实施例中,系统内存分配函数面向整个操作系统内部的所有应用程序进程,在动态分配与释放内存的过程中,以均衡为目标,缺乏对单个应用程序进程的定制能力,示例性的,由于手机内存芯片的大小是受限的,应该让每个应用程序进行使用尽量少的内存。但是,在实际的使用中,系统内存分配函数的内存分配与释放方式,可能并不是处理某一应用程序进程的优选方式,为了优化内存管理在现有开源的内存分配函数的基础上进行二次开发,针对应用程序进程自身的内存分配特点做更多定制化,以便于提升应用程序进程本身的性能。93.示例性的,如果应用程序线程(如,主线程,音频线程、页面渲染线程)在执行过程中,需要频繁的调用已存储数据,那么需要为该应用程序线程分配更多的内存缓存,用于实现以空间换时间的目的。94.本公开提供的技术方案至少带来以下有益效果:在进行函数地址替换之前,生成第二内存管理函数,以便于提高动态分配内存的内存分配速度。95.在本公开实施例中,如图8所示,系统分配器中的第一内存分配函数,与替换分配器中第二内存分配函数,通过内联挂钩inlinehook方式进行替换,在替换过程中的关键代码包括:[0096][0097][0098]通过上述代码可以实现:将被第二内存管理函数头部的前16字节,修改为跳转至第一内存管理函数。具体为,使用ldr相对寻址,从内存中加载跳转地址至x16寄存器,然后使用br跳转指令执行替换。[0099]上述主要从方法的角度对本公开实施例的方案进行了介绍。可以理解的是,优化内存管理装置为了实现上述功能,其包含了执行各个功能相应的硬件结构和软件模块中的至少一个。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本公开能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。[0100]本公开实施例可以根据上述方法示例对优化内存管理装置进行功能单元的划分,例如,可以对应各个功能划分各个功能单元,也可以将两个或两个以上的功能集成在一个处理单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。需要说明的是,本公开实施例中对单元的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。[0101]图9是根据一示例性实施例示出的一种优化内存管理装置的结构示意图。参照图9所示,本公开实施例提供的优化内存管理装置,包括获取单元91、设置单元92、替换单元93以及调用单元94;[0102]获取单元91,用于获取第一内存管理函数的第一函数地址,第一内存管理函数为系统内存管理函数;例如,如图2所示,获取单元91可以用于执行步骤201。[0103]设置单元92,用于将获取单元91获取的第一函数地址对应的内存权限设置为写权限;例如,如图2所示,设置单元92可以用于执行步骤202。[0104]替换单元93,用于将获取单元91获取的第一函数地址替换为第二内存管理函数的第二函数地址,第二内存管理函数为预置内存管理函数;例如,如图2所示,替换单元93可以用于执行步骤203。[0105]调用单元94,用于通过替换单元93替换的第二函数地址,调用第二内存管理函数以动态分配内存。例如,如图2所示,调用单元94可以用于执行步骤204。[0106]可选的,上述获取单元91,用于:在第一内存管理函数为系统库的导出函数的情况下,将使用动态加载库加载以目标字符为后缀的函数库时为第一内存管理函数分配的地址,确定为第一函数地址;在第一内存管理函数不为系统库的导出函数的情况下,在当前进程内存映射区域内与第一内容分配函数的函数名称相匹配的地址,确定为第一函数地址。例如,如图3所示,获取单元91可以用于执行步骤301和步骤302。[0107]可选的,上述替换单元93,用于:在内联挂钩指令集合中,查找替换指令,替换指令为用于替换函数地址的指令;根据替换指令,将第一函数地址替换为第二内存管理函数的第二函数地址。例如,如图4所示,替换单元93可以用于执行步骤401和步骤402。[0108]可选的,上述优化内存管理装置还包括处理单元95;[0109]处理单元95,用于替换单元93将第一函数地址替换为第二内存管理函数的第二函数地址之后,采用预置函数,清除第一函数地址,将第一函数地址对应的内存权限设置为只读权限。例如,如图6所示,处理单元95可以用于执行步骤601。[0110]可选的,上述优化内存管理装置还包括生成单元96;生成单元96,用于获取单元91获取第一内存管理函数的第一函数地址之前,根据第一内存管理函数的函数功能,生成第二内存管理函数;其中,函数功能包括以下至少一项:内存分配、内存释放、内存块分配、内存对齐分配。例如,如图7所示,生成单元96可以用于执行步骤701。[0111]可选的,上述优化内存管理装置还包括抓取单元97和释放单元98;[0112]抓取单元97,用于替换单元93将第一函数地址替换为第二内存管理函数的第二函数地址之后,抓取用于释放已分配内存的目标内存管理函数,目标内存管理函数为第一内存管理函数或第二内存管理函数;例如,如图5所示,抓取单元97可以用于执行步骤501。[0113]释放单元98,用于在抓取单元97抓取的目标内存管理函数为第一内存管理函数的情况下,在第一内存管理函数对应的堆内存区域内释放内存空间;例如,如图5所示,释放单元98可以用于执行步骤502。[0114]释放单元98,还用于在抓取单元97抓取的目标内存管理函数为第二内存管理函数的情况下,在第二内存管理函数对应的堆内存区域内释放内存空间。例如,如图5所示,释放单元98可以用于执行步骤503。[0115]可选的,上述优化内存管理装置还包括判断单元99;判断单元99,用于抓取单元97抓取用于释放已分配内存的目标内存管理函数之后,基于目标内存管理函数对应的动态树长度,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数;判断单元99,还用于抓取单元97抓取用于释放已分配内存的目标内存管理函数之后,基于目标内存管理函数中待释放内存的指针标记,判断目标内存管理函数为第一内存管理函数,或者第二内存管理函数。[0116]关于上述实施例中的装置,其中各个单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。[0117]图10是本公开提供的一种电子设备的结构示意图。如图10,该电子设备可以包括处理器1001、用于存储处理器1001可执行指令的存储器1002;其中,上述处理器1001被配置为执行上述指令,以实现上述实施例中的优化内存管理方法。[0118]另外,电子设备还可以包括通信总线1003以及至少一个通信接口1004。[0119]处理器1001可以是一个中央处理器(centralprocessingunits,cpu),微处理单元,专用集成电路(applicationspecificintegratedcircuit,asic),或一个或多个用于控制本公开方案程序执行的集成电路。[0120]通信总线1003为信号通路,用于在上述组件之间传送信息。[0121]通信接口1004,使用任何收发器一类的装置,用于与其他设备或通信网络通信,如以太网,无线接入网(radioaccessnetwork,ran),无线局域网(wirelesslocalareanetworks,wlan)等。[0122]存储器1002可以是只读存储器(read-onlymemory,rom)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(randomaccessmemory,ram)或者可存储信息和指令的其他类型的动态存储设备,也可以是电可擦可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、只读光盘(compactdiscread-onlymemory,cd-rom)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储器1002可以是独立存在,通过通信总线1003与处理器1001相连接。存储器1002也可以和处理器1001集成在一起。[0123]其中,存储器1002用于存储执行本公开方案的指令,并由处理器1001来控制执行。处理器1001用于执行存储器1002中存储的程序或指令,从而实现本公开方法中的功能。[0124]作为一个示例,结合图9,优化内存管理装置中的获取单元91、设置单元92、替换单元93以及调用单元94实现的功能与图10中的处理器1001的功能相同。[0125]在具体实现中,作为一种实施例,处理器1001可以包括一个或多个cpu,例如图10中的cpu0和cpu1。[0126]在具体实现中,作为一种实施例,电子设备可以包括多个处理器1001,这些处理器1001中的每一个可以是一个单核(single-cpu)处理器,也可以是一个多核(multi-cpu)处理器。这里的处理器1001可以指一个或多个设备、电路、和/或用于处理数据(例如计算机程序指令)的处理核。[0127]在具体实现中,作为一种实施例,电子设备还可以包括输出设备1005和输入设备1006。输出设备1005和处理器1001通信,可以以多种方式来显示信息。例如,输出设备1005可以是液晶显示器(liquidcrystaldisplay,lcd),发光二级管(lightemittingdiode,led)显示设备,阴极射线管(cathoderaytube,crt)显示设备,或投影仪(projector)等。输入设备1006和处理器1001通信,可以以多种方式接受用户的输入。例如,输入设备1006可以是鼠标、键盘、触摸屏设备或传感设备等。[0128]本领域技术人员可以理解,图10中示出的结构并不构成对电子设备的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。图10中的电子设备可以是服务器,也可以是客户端或其他设备。[0129]另外,本公开还提供一种可读存储介质,可读存储介质上存储程序或指令,当上述可读存储介质中的指令被处理器执行时,使得电子设备能够执行如上述实施例所提供的优化内存管理方法。可选的,可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。[0130]另外,本公开还提供一种计算机程序产品,包括计算机程序/指令,该计算机程序产品被存储在非易失的可读存储介质中,计算机程序产品被至少一个处理器执行时,使得电子设备执行如上述实施例所提供的优化内存管理方法。[0131]本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本
技术领域:
:中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。[0132]应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。当前第1页12当前第1页12