内存管理方法、装置、计算机设备和存储介质转让专利

申请号 : CN202010642201.7

文献号 : CN111796941A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朴英敏

申请人 : 北京字节跳动网络技术有限公司

摘要 :

本公开提供了一种内存管理方法、装置、计算机设备和存储介质,该方法包括:当确定应用不需要加载目标动态库时,获取动态库加载列表;从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。本公开实施例能够提高虚拟内存的利用率。

权利要求 :

1.一种内存管理方法,其特征在于,该方法包括:

当确定应用不需要加载目标动态库时,获取动态库加载列表;

从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;

基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。

2.如权利要求1所述的方法,其特征在于,从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址,包括:从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;

在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。

3.如权利要求1所述的方法,其特征在于,所述方法还包括:

读取所述应用中的配置文件中的动态库加载参数值;

根据所述动态库加载参数值,确定所述应用是否需要加载目标动态库。

4.如权利要求1所述的方法,其特征在于,基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,包括:基于所述程序头地址,查找到所述目标动态库的程序头信息;

从所述程序头信息中提取偏移地址,以及第一目标数据段的长度;

基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址;所述第一目标数据段中包含所述第二目标数据段中的数据;

基于所述第二目标数据段的实际起始地址和实际结束地址,从所述第二目标数据段中,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址。

5.如权利要求4所述的方法,其特征在于,基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址,包括:基于所述偏移地址和所述第一目标数据段的长度,确定所述第一目标数据段的结束偏移地址;

基于所述第一目标数据段的结束偏移地址,和第二目标数据段的预设长度,确定所述第二目标数据段的起始偏移地址;

基于所述动态库加载地址,以及所述第二目标数据段的起始偏移地址和所述第一目标数据段的结束偏移地址,确定所述第二目标数据段的实际起始地址和实际结束地址。

6.如权利要求1所述的方法,其特征在于,所述释放该内存地址对应的虚拟内存,包括:在所述应用对应的内存映射表中,查找所述内存地址;

若查找到所述内存地址,则释放该内存地址对应的虚拟内存。

7.一种内存管理装置,其特征在于,该装置包括:

第一获取模块,用于当确定应用不需要加载目标动态库时,获取动态库加载列表;

第二获取模块,用于从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;

处理模块,用于基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。

8.如权利要求7所述的装置,其特征在于,所述第二获取模块用于根据以下步骤获取所述目标动态库的动态库加载地址和程序头地址:从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;

在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。

9.一种计算机设备,其特征在于,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行如权利要求1~6任一所述方法的步骤。

10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如权利要求1~6任一所述方法的步骤。

说明书 :

内存管理方法、装置、计算机设备和存储介质

技术领域

[0001] 本公开涉及通信处理技术领域,具体而言,涉及一种内存管理方法、装置、计算机设备和存储介质。

背景技术

[0002] 运行有安卓系统的终端设备中运行有大量的应用,应用在运行过程中,需要加载系统的动态库(如网页视图动态库),那么,在应用启动时需要为应用预留一定大小的虚拟内存,该虚拟内存仅供应用加载该系统的动态库,其它应用无法使用该部分虚拟内存。
[0003] 由于应用在运行过程中,可能会采用开发人员研发的针对该应用的动态库,也可能不需要调用系统的动态库,此时会造成预留的虚拟内存的浪费,也会降低预留虚拟内存的利用率。

发明内容

[0004] 本公开实施例至少提供一种内存管理方法、装置、计算机设备和存储介质,提高虚拟内存的利用率。
[0005] 第一方面,本公开实施例提供了一种内存管理方法,该方法包括:
[0006] 当确定应用不需要加载目标动态库时,获取动态库加载列表;
[0007] 从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;
[0008] 基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。
[0009] 在一种实施方式中,从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址,包括:
[0010] 从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;
[0011] 在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。
[0012] 在一种实施方式中,所述方法还包括:
[0013] 读取所述应用中的配置文件中的动态库加载参数值;
[0014] 根据所述动态库加载参数值,确定所述应用是否需要加载目标动态库。
[0015] 在一种实施方式中,基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,包括:
[0016] 基于所述程序头地址,查找到所述目标动态库的程序头信息;
[0017] 从所述程序头信息中提取偏移地址,以及第一目标数据段的长度;
[0018] 基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址;所述第一目标数据段中包含所述第二目标数据段中的数据;
[0019] 基于所述第二目标数据段的实际起始地址和实际结束地址,从所述第二目标数据段中,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址。
[0020] 在一种实施方式中,基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址,包括:
[0021] 基于所述偏移地址和所述第一目标数据段的长度,确定所述第一目标数据段的结束偏移地址;
[0022] 基于所述第一目标数据段的结束偏移地址,和第二目标数据段的预设长度,确定所述第二目标数据段的起始偏移地址;
[0023] 基于所述动态库加载地址,以及所述第二目标数据段的起始偏移地址和所述第一目标数据段的结束偏移地址,确定所述第二目标数据段的实际起始地址和实际结束地址。
[0024] 在一种实施方式中,所述释放该内存地址对应的虚拟内存,包括:
[0025] 在所述应用对应的内存映射表中,查找所述内存地址;
[0026] 若查找到所述内存地址,则释放该内存地址对应的虚拟内存。
[0027] 第二方面,本申请实施例提供了一种内存管理装置,该装置包括:
[0028] 第一获取模块,用于当确定应用不需要加载目标动态库时,获取动态库加载列表;
[0029] 第二获取模块,用于从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;
[0030] 处理模块,用于基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。
[0031] 在一种实施方式中,所述第二获取模块用于根据以下步骤获取所述目标动态库的动态库加载地址和程序头地址:
[0032] 从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;
[0033] 在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。
[0034] 第三方面,本公开实施例提供了一种计算机设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行第一方面任一所述方法的步骤。
[0035] 第四方面,本公开实施例提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如第一方面任一所述方法的步骤。
[0036] 本公开实施例提供了一种内存管理方法,当确定应用不需要加载目标动态库时,获取动态库加载列表,从动态库加载列表中,获取目标动态库的动态库加载地址和程序头地址,基于动态库加载地址和程序头地址,确定为应用预留的用于加载所述目标动态库的虚拟内存地址,并释放该虚拟内存地址对应的虚拟内存,这样,释放为不需要加载目标动态库的应用预留的虚拟内存,便于其它应用或进程使用该虚拟内存,提高了虚拟内存的利用率。
[0037] 为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

[0038] 为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0039] 图1示出了本公开实施例所提供的一种内存管理方法的流程示意图;
[0040] 图2示出了本公开实施例所提供的一种内存管理装置的结构示意图;
[0041] 图3示出了本公开实施例所提供的一种计算机设备的示意图。

具体实施方式

[0042] 为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
[0043] 网页视图是基于浏览器(Webkit)引擎用于显示和渲染网页的开源框架,安卓系统中也设置了网页视图(webview)组件,而webview动态库一般比较大,初始化需要消耗很长时间,为了提高系统的启动性能,安卓系统会做懒加载处理,也就是,在系统启动时,不加载webview的动态库,在应用使用webview动态库时,才会加载webview动态库。
[0044] 考虑到应用加载webview动态库时,需要如100M左右的连续虚拟内存,有可能应用真正要加载的时候,无法分配虚拟内存。因此,在系统初始化时,会预先创建100M左右的虚拟内存,用于应用加载webview动态库。
[0045] 在安卓系统启动时,会启动zygote的孵化器进程,zygote进程会加载大部分系统的动态库和准备Java运行时的环境,随后,进入孵化状态。当存在应用的进程启动时,该孵化器就会克隆一个子进程,这个子进程即为应用的进程,由于zygote进程预留了100M的虚拟内存,因此,克隆出来的进程也就继承了这部分虚拟内存。
[0046] 应用在使用webview动态库时,会使用预留的虚拟内存加载webview动态库,而部分应用可能并不会使用系统的webview动态库,若为该应用预留虚拟内存,该预留虚拟内存无法被线程或其它应用使用,降低了虚拟内存的利用率。
[0047] 基于上述研究,本公开实施例提供了一种内存管理方法,当确定应用不需要加载目标动态库时,获取动态库加载列表,从动态库加载列表中,获取目标动态库的动态库加载地址和程序头地址,基于动态库加载地址和程序头地址,确定为应用预留的用于加载所述目标动态库的虚拟内存地址,并释放该虚拟内存地址对应的虚拟内存,这样,释放为不需要加载目标动态库的应用预留的虚拟内存,便于其它应用或进程使用该虚拟内存,提高了虚拟内存的利用率。
[0048] 需要说明的是,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人对本公开做出的贡献。
[0049] 应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
[0050] 为便于对本实施例进行理解,首先对本公开实施例所公开的一种内存管理方法进行详细介绍,本公开实施例所提供的内存管理方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备,终端设备可以为用户设备(User Equipment,UE)、移动设备、蜂窝电话、无绳电话、个人数字处理(Personal Digital Assistant,PDA)、手持设备、计算设备、车载设备、可穿戴设备等。在一些可能的实现方式中,该内存管理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
[0051] 下面以执行主体为终端设备中运行的应用为例对本公开实施例提供的内存管理方法加以说明。
[0052] 参见图1所示,为本公开实施例提供的内存管理方法的流程图,具体可以包括以下步骤:
[0053] S101,当确定应用不需要加载目标动态库时,获取动态库加载列表。
[0054] 这里,目标动态库可以为应用在运行过程中不需要加载的系统的动态库,比如,目标动态库可以为系统的网页视图(webview)动态库;动态库加载列表中包括动态库加载路径、动态库加载地址和程序头地址之间的对应关系,其中,动态库加载路径为动态库文件对应的存储路径,该动态库存储路径中包含有动态库的库标识(如库名称);动态库加载地址表征将动态库加载到进程中的实际内存地址,动态库加载地址和程序头地址下文详述。
[0055] 在具体实施过程,应用在确定自身不需要加载目标动态库后,应用的主进程获取动态库加载列表,该动态库加载列表一般为双向链表,链表中的每一个节点为一个动态库,以便应用的主进程进行后续的查询操作。
[0056] 判断应用是否需要加载目标动态库,一般在应用启动后即刻进行,或者在应用运行过程中进行,可以根据实际应用场景确定。应用运行在终端设备中,终端设备运行的操作系统可以是但不限于安卓操作系统等,可以根据实际情况确定。
[0057] 在应用启动后,可以根据以下步骤确定该用是否需要加载目标动态库:
[0058] 读取应用中的配置文件中的动态库加载参数值;
[0059] 根据所述动态库加载参数值,则确定所述应用是否需要加载目标动态库。
[0060] 这里,配置文件是预先设置的,配置文件中包括有指示应用是否需要加载动态库的动态库加载参数值。
[0061] 在具体实施过程中,在应用启动后,应用的主进程可以从应用的配置文件中获取动态库加载参数值,动态库加载参数值用于指示应用是否需要加载动态库(如系统的webview动态库),比对针对目标动态库的动态库加载参数值与预设值,当该动态库加载参数值与预设值不相同时,说明应用不需要加载目标动态库,否则,说明应用需要加载目标动态库。其中,预设值可以为根据实际需求设置的值,比如,预设值可以为1。
[0062] S102,从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息。
[0063] 在获取所述目标动态库的动态库加载地址和程序头地址时,可以包括以下步骤:
[0064] 从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。
[0065] 这里,库标识可以为库名称,例如,在目标动态库为系统的webview动态库时,库标识可以为loader.so。
[0066] 在具体实施过程中,在获取动态库加载列表后,从多个动态库加载路径中,查询包含目标动态库的库标识的动态库加载路径,若查找到包含目标动态库的库标识的动态库加载路径,将查找到的动态库加载路径作为目标动态库加载路径,则从动态库加载列表中,获取与目标动态库加载路径对应的动态库加载地址和程序头地址。
[0067] 例如,当目标动态库为系统的webview动态库时,从动态库加载列表中,查找包含loader.so的动态库加载路径,在查找到包含loader.so的动态库加载路径后,获取包含loader.so的动态库加载路径对应的动态库加载地址和程序头地址。
[0068] S103,基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该虚拟内存地址对应的虚拟内存。
[0069] 这里,预留虚拟内存的内存地址可以包括起始地址和结束地址。
[0070] 在确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址时,可以包括以下步骤:
[0071] 基于所述程序头地址,查找到所述目标动态库的程序头信息;
[0072] 从所述程序头信息中提取偏移地址,以及第一目标数据段的长度;
[0073] 基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址;所述第一目标数据段中包含所述第二目标数据段中的数据;
[0074] 基于所述第二目标数据段的实际起始地址和实际结束地址,从所述第二目标数据段中,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址。
[0075] 这里,程序头信息中的偏移信息可以包括动态库的偏移地址(VirtAddr)、程序头信息大小(memSize)、程序头的标志位和程序头的对齐方式(Align)等,此处不对程序头信息中的其它信息进行详细介绍。其中,VirtAddr就表示程序头需要要加载到虚拟内存中的起始偏移地址;memSize表示程序头在内存中的大小;flg为表示程序头的标志位,其中,标志位中的R表示可读,标志位中的W表示可写,标志位中的RW表示可读写;Align表示程序头的对齐方式,0x4表示4字节对齐,0x1000表示4K对齐。
[0076] 程序头信息中包括的地址为偏移地址,也就是,相对动态库加载地址的偏移地址,从程序头中提取的偏移地址表征数据段相对动态库加载地址的偏移地址,该偏移地址可以为第一目标数据段的起始偏移地址,第一目标数据段为目标动态库的读写段,该读写段包括data段和bss段;第一目标数据段中包括第二目标数据段中的数据,在实际应用中,第二目标数据段可以为bss段,第一目标数据段的实际结束地址和第二目标数据段的实际结束地址为同一个地址(即bss段的结束地址)。
[0077] 在获取到程序头地址后,可以利用该程序头地址查找到目标动态库的程序头信息,利用程序头地址获取程序头信息的过程不进行详细介绍。
[0078] 从程序头信息中查找第一目标数据段的偏移地址和长度,即,在程序头信息中,查找类型为Load、程序头标志位(flg)为RW的数据,从查找到数据中提取VirtAddr和memSize,提取的VirtAddr为第一目标数据段的起始偏移地址,memSize为第一目标数据段的长度。
[0079] 在查找到第一目标数据段的偏移地址和长度后,利用偏移地址、第一目标数据段的长度、以及动态库加载地址,确定第二目标数据段的实际起始地址和实际结束地址,可以包括以下步骤:
[0080] 基于所述偏移地址和所述第一目标数据段的长度,确定所述第一目标数据段的结束偏移地址,基于第一目标数据段的结束偏移地址,和第二目标数据段的预设长度,确定所述第二目标数据段的起始偏移地址,基于所述动态库加载地址,以及所述第二目标数据段的起始偏移地址和所述第一目标数据段的结束偏移地址,确定所述第二目标数据段的实际起始地址和实际结束地址。
[0081] 具体地,第二目标数据段中用于存放与目标动态库相关的多个变量,在实际应用中,当目标动态库为系统的webview动态库时,第二目标数据段中可以存储7个变量,例如,预留虚拟内存地址、预留虚拟内存的大小等变量,当每个变量为4个字节时,第二目标数据段的长度为28字节(若为16进制,该长度为0x1c);第二目标数据段的起始偏移地址为第二目标数据段相对动态库加载地址的偏移地址;第二目标数据段的实际起始地址为第二目标数据段的起始内存地址(即绝对内存地址),实际结束地址为第二目标数据段的结束内存地址(即绝对内存地址)。
[0082] 在一种实施方式中,在获取第一目标数据段的起始偏移地址和长度后,计算该起始偏移地址和长度的和值,将该和值作为第一目标数据段的结束偏移地址,由于第一目标数据段的结束偏移地址和第二目标数据段的结束偏移地址为同一个偏移地址,计算第一目标数据段的结束偏移地址和第二目标数据段的长度的差值,该差值则为第二目标数据段的起始偏移地址。
[0083] 例如,以目标动态库为系统的webview动态库为例,第一目标数据段的起始偏移地址为0x2000,长度为0x201c,则第一目标数据段的结束偏移地址为0x2000+0x201c=0x401c,0x401c即为第二目标数据段的结束偏移地址(也即bss段的结束偏移地址),在第二目标数据段为16进制时,第二目标数据段的大小为0x1c,那么,第二目标数据段的起始偏移地址为0x401c-0x1c=0x4000。
[0084] 在得到第二目标数据段的起始偏移地址和结束偏移地址后,计算动态库加载地址和第二目标数据段的起始偏移地址的和值,将该和值作为第二目标数据段的实际起始地址(绝对内存地址),计算动态库加载地址和第二目标数据段的结束偏移地址的和值,将该和值作为第二目标数据段的实际结束地址。
[0085] 利用第二目标数据段的实际起始地址和实际结束地址,可以获取第二目标数据段中的数据,由于预留虚拟内存的大小都比较大,一般为4096的倍数,而其它变量的大小为小于10的数,因此,可以通过读取的数据大小,从第二目标数据段对应的数据中提取预留虚拟内存的地址和大小,比如,判断第二目标数据段中每个变量值是否大于预设阈值(如4096),若该变量值大于预设阈值,则确定该变量值为虚拟内存的大小。
[0086] 在得到预留虚拟内存的起始内存地址和长度后,调用解除内存映射(munmap)方法,释放为应用预留的用于加载目标动态库的虚拟内存,也就是,将预留虚拟内存的起始内存地址和大小传入munmap函数,以解除应用和该内存地址对应的虚拟内存之间的映射关系,这样,该应用中的其它线程或其它应用可以使用释放的该虚拟内存,提高了虚拟内存的利用率。
[0087] 在释放虚拟内存时,考虑到在查找为应用预留的空间(虚拟内存)的内存地址过程中可能存在问题,从而导致查找到的内存地址是错误的,若释放了一个错误的内存地址对应的虚拟内存,可能会导致系统崩溃。所以,为了避免系统崩溃,可以进一步验证确定的起始内存地址是否准确,即,在应用对应的内存映射表中,查找预留虚拟内存的内存地址,若查找到该内存地址,则释放该内存地址对应的虚拟内存。
[0088] 内存映射表中包括应用所使用多个虚拟内存分别对应的内存地址,依次比对确定的起始内存地址和内存映射表中的各个内存地址,若虚拟内存表中存在与确定的该起始内存地址相同的内存地址,说明确定的该内存地址为准确的,则直接释放确定的该起始内存地址对应的虚拟内存,释放虚拟内存的过程可以参考上文。
[0089] 基于同一发明构思,本公开实施例中还提供了与内存管理方法对应的内存管理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述内存管理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
[0090] 参考图2,本公开实施例提供了一种内存管理装置的示意图,所述装置包括:
[0091] 第一获取模块21,用于当确定应用不需要加载目标动态库时,获取动态库加载列表;
[0092] 第二获取模块22,用于从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;
[0093] 处理模块23,用于基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。
[0094] 在一种实施方式中,所述第二获取模块22用于根据以下步骤获取所述目标动态库的动态库加载地址和程序头地址:
[0095] 从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;
[0096] 在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。
[0097] 在一种实施方式中,所述第一获取模块21还用于:
[0098] 读取所述应用中的配置文件中的动态库加载参数值;
[0099] 根据所述动态库加载参数值,确定所述应用是否需要加载目标动态库。
[0100] 在一种实施方式中,所述处理模块23用于根据以下步骤基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址:
[0101] 基于所述程序头地址,查找到所述目标动态库的程序头信息;
[0102] 从所述程序头信息中提取偏移地址,以及第一目标数据段的长度;
[0103] 基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址;所述第一目标数据段中包含所述第二目标数据段中的数据;
[0104] 基于所述第二目标数据段的实际起始地址和实际结束地址,从所述第二目标数据段中,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址。
[0105] 在一种实施方式中,所述处理模块23用于根据以下步骤确定所述第二目标数据段的实际起始地址和实际结束地址:
[0106] 基于所述偏移地址和所述第一目标数据段的长度,确定所述第一目标数据段的结束偏移地址;
[0107] 基于所述第一目标数据段的结束偏移地址,和第二目标数据段的预设长度,确定所述第二目标数据段的起始偏移地址;
[0108] 基于所述动态库加载地址,以及所述第二目标数据段的起始偏移地址和所述第一目标数据段的结束偏移地址,确定所述第二目标数据段的实际起始地址和实际结束地址。
[0109] 在一种实施方式中,所述处理模块23用于根据以下步骤释放该虚拟内存地址对应的虚拟内存:
[0110] 在所述应用对应的内存映射表中,查找所述内存地址;
[0111] 若查找到所述内存地址,则释放该内存地址对应的虚拟内存。
[0112] 对应于图1中的内存管理方法,本公开实施例还提供了一种计算机设备30,如图3所示,为本公开实施例提供的计算机设备30结构示意图,包括:
[0113] 处理器31、存储器32、和总线33;存储器32用于存储执行指令,包括内存321和外部存储器322;这里的内存321也称内存储器,用于暂时存放处理器31中的运算数据,以及与硬盘等外部存储器322交换的数据,处理器31通过内存321与外部存储器322进行数据交换,当所述计算机设备30运行时,所述处理器31与所述存储器32之间通过总线33通信,使得所述处理器31在用户态执行以下指令:
[0114] 当确定应用不需要加载目标动态库时,获取动态库加载列表;
[0115] 从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址;所述动态库加载地址表示所述目标动态库的实际内存地址,所述程序头地址表示所述目标动态库的程序头信息的内存地址,所述程序头信息包括为所述应用预留的用于加载目标动态库的虚拟内存的内存地址相对所述动态库加载地址的偏移信息;
[0116] 基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,并释放该内存地址对应的虚拟内存。
[0117] 一种可能的实施方式中,处理器31执行的指令中,从所述动态库加载列表中,获取所述目标动态库的动态库加载地址和程序头地址,包括:
[0118] 从所述动态库加载列表中查找包含所述目标动态库的库标识的动态库加载路径,作为目标动态库加载路径;
[0119] 在所述动态库加载列表中获取所述目标动态库加载路径对应的动态库加载地址和程序头地址。
[0120] 一种可能的实施方式中,处理器31执行的指令中,还包括:
[0121] 读取所述应用中的配置文件中的动态库加载参数值;
[0122] 根据所述动态库加载参数值,确定所述应用是否需要加载目标动态库。。
[0123] 一种可能的实施方式中,处理器31执行的指令中,基于所述动态库加载地址和程序头地址,确定为所述应用预留的用于加载所述目标动态库的虚拟内存的内存地址,包括:
[0124] 基于所述程序头地址,查找到所述目标动态库的程序头信息;
[0125] 从所述程序头信息中提取偏移地址,以及第一目标数据段的长度;
[0126] 基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址;所述第一目标数据段中包含所述第二目标数据段中的数据;
[0127] 基于所述第二目标数据段的实际起始地址和实际结束地址,从所述第二目标数据段中确定所述目标动态库的虚拟内存的内存地址。
[0128] 一种可能的实施方式中,处理器31执行的指令中,基于所述偏移地址、所述第一目标数据段的长度、以及所述动态库加载地址,确定所述第二目标数据段的实际起始地址和实际结束地址,包括:
[0129] 基于所述偏移地址和所述第一目标数据段的长度,确定所述第一目标数据段的结束偏移地址;
[0130] 基于所述第一目标数据段的结束偏移地址,和第二目标数据段的预设长度,确定所述第二目标数据段的起始偏移地址;
[0131] 基于所述动态库加载地址,以及所述第二目标数据段的起始偏移地址和所述第一目标数据段的结束偏移地址,确定所述第二目标数据段的实际起始地址和实际结束地址。
[0132] 一种可能的实施方式中,处理器31执行的指令中,所述释放该虚拟内存地址对应的虚拟内存,包括:
[0133] 在所述应用对应的内存映射表中,查找所述内存地址;
[0134] 若查找到所述内存地址,则释放该内存地址对应的虚拟内存。
[0135] 本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的内存管理方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
[0136] 本公开实施例所提供的内存管理方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的内存管理方法的步骤,具体可参见上述方法实施例,在此不再赘述。
[0137] 本公开实施例还提供一种计算机程序,该计算机程序被处理器执行时实现前述实施例的任意一种方法。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
[0138] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0139] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0140] 另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0141] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0142] 最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。