发明内容
本公开实施例至少提供一种内存处理方法及装置。
第一方面,本公开实施例提供了一种内存处理方法,应用于虚拟机,包括:
响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;
对所述快照数据进行解析,得到所述快照数据的解析结果;
利用所述快照数据的解析结果,启动所述目标应用;
在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;
针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。
一种可选的实施方式中,所述方法还包括:
响应于所述虚拟机的老年代内存空间销毁指令,启用第一内存释放模式,释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存。
一种可选的实施方式中,所述目标应用为通过dart编程语言编写的应用。
一种可选的实施方式中,所述释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存,包括:
遍历所述老年代内存空间对应的虚拟页面,在遍历到一新虚拟页面时,释放当前遍历到的虚拟页面对应的虚拟内存;
在释放完成一虚拟页面对应的虚拟内存后,立即释放其映射的物理内存。
一种可选的实施方式中,所述用于快速启动并发进程的数据。
第二方面,本公开实施例还提供一种内存处理装置,用于虚拟机,包括:
响应模块,用于响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;
解析模块,用于对所述快照数据进行解析,得到所述快照数据的解析结果;
启动模块,用于利用所述快照数据的解析结果,启动所述目标应用;
第一释放模块,用于在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;
第二释放模块,用于针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。
一种可选的实施方式中,所述第一释放模块还用于:
响应于所述虚拟机的老年代内存空间销毁指令,启用所述第一内存释放模式,释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存。
一种可选的实施方式中,所述目标应用为通过dart编程语言编写的应用。
一种可选的实施方式中,所述第一释放模块在释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存时,用于:
遍历所述老年代内存空间对应的虚拟页面,在遍历到一新虚拟页面时,释放当前遍历到的虚拟页面对应的虚拟内存;
在释放完成一虚拟页面对应的虚拟内存后,立即释放其映射的物理内存。
一种可选的实施方式中,所述快照数据为用于快速启动并发进程的数据。
第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的内存处理方法及装置,首先响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;然后,对所述快照数据进行解析,得到所述快照数据的解析结果;其次,利用所述快照数据的解析结果,启动所述目标应用;之后,在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;同时,针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。本公开实施例通过在快照数据解析完成后,利用第一内存释放模式主动释放快照数据对应的虚拟内存,从而降低虚拟机所占用的虚拟内存,并且,通过第二内存释放模式在内存释放的时间节点对已被释放的虚拟内存对应的物理内存释放,进而降低目标应用所占用的物理内存,优化终端设备运行目标应用时的性能。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
为了解决Flutter应用占用内存较大,内存容量较小的终端设备不足以支撑Flutter应用正常运行的问题,本公开提供了一种内存处理方法,通过在快照数据解析完成后,主动释放快照数据对应的虚拟内存,从而降低虚拟机所占用的虚拟内存,并且,在内存释放的时间节点对已被释放的虚拟内存对应的物理内存释放,进而降低目标应用所占用的物理内存,优化终端设备运行目标应用时的性能。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种内存处理方法进行详细介绍,本公开实施例所提供的内存处理方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备可以运行有虚拟机,计算机设备例如包括:终端设备或服务器或其它处理设备。在一些可能的实现方式中,该内存处理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的内存处理方法的流程图,所述方法可以应用于虚拟机,所述方法包括步骤S101~S104,其中:
S101、响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中。
该步骤中,终端设备可以响应于触发的启动指令,运行虚拟机,将用于加速启动目标应用的快照数据加载到虚拟机占用的虚拟内存中。
其中,上述目标应用可以为Flutter应用,Flutter是一种用于构建用户界面的工具包,利用Flutter开发的应用又被成为Flutter应用,Flutter应用是通过dart编程语言进行编写的,因此,需要运行在dart虚拟机之上,dart虚拟机可以向终端设备的操作系统申请需要的内存,操作系统接收到请求并选取物理内存分配给虚拟机,通常,应用需要使用一段连续的可用的物理内存,而虚拟机能够将零散的物理内存模拟成为一段连续的虚拟内存,虚拟内存与物理内存之间存在映射关系,通过映射关系,即可根据虚拟内存的地址读取物理内存中存储的数据,这样,终端设备的操作系统可以随时向虚拟机分配不连续的物理内存,也不影响虚拟机的正常运行。
为了实现Flutter应用的快速启动,在Flutter应用的构建产物中使用了这样一部分数据,该部分数据通过快照的方式,将正常运行时的数据状态构建成一个完整可用的备份,在启动目标应用时直接使用快照数据,将部分功能恢复为正常运行时的状态,跳过启动阶段,实现加速应用的启动。
其中,上述快照数据可以为并行线程的快照数据isolate_snapshot_data,用于加速启动并行线程。
S102、对所述快照数据进行解析,得到所述快照数据的解析结果。
该步骤中,可以对加载至虚拟内存中的快照数据进行解析,得到可运行的解析结果,以便快速启动快照数据对应的功能。
S103、利用所述快照数据的解析结果,启动所述目标应用。
该步骤中,即可运行上述解析结果,实现目标应用部分或全部功能的快速启动。
S104、在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存。
通常情况下,在利用快照数据进行快速启动后,虚拟机通常会继续保留存储快照数据的虚拟内存,但由于该内存后续并不会再次被使用,导致该虚拟内存一直处于无效的状态,虚拟机则需要申请更多的虚拟内存从而执行其他指令,使目标应用占用了更多的内存。
通过该步骤,在解析完成后,可以采用第一内存释放模式,第一内存释放模式可以立即释放快照数据对应的虚拟内存,也即存储快照数据的虚拟内存,并立即释放其对应的物理内存,不需要等待物理内存释放的时间节点,能够有效降低目标应用占用的内存,并提高内存的有效使用率。
S105、针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。
在目标应用的运行过程中,经常需要申请内存及释放内存,当虚拟机对存储目标类型数据的内存的使用结束后,可以采用第二内存释放模式,第二内存释放模式一般先释放虚拟内存,而虚拟内存对应的物理内存则会收到运行虚拟机的操作系统的设置影响,在到达物理内存释放的时间节点的情况下,才将已经被释放的虚拟内存对应的物理内存释放。该种方式可以为虚拟机的通常内存释放模式,采用第二内存释放模式的目标类型数据可以包括如函数的参数数据、待使用对象数据等。
第一内存释放模式与第二内存释放模式的区别在于,第一内存释放模式在虚拟内存释放后,立即释放其对应的物理内存,而第二内存释放模式受到操作系统的设置影响,释放物理内存存在延迟,被释放的虚拟内存可能会被虚拟机再次利用,由于快照数据通常在加速启动完成后,不会再次使用,而且,被占用的虚拟内存及物理内存也不会用于其他的用途,因此,可以立即释放其虚拟内存和物理内存,相似的,若存在其他与快照数据相似的数据,则也可以使用第一内存释放模式。
一般情况下,dart虚拟机通常使用分代内存管理方案,将内存划分为新生代(年轻代)内存和老年代内存,由新生代内存组成的内存空间可以被称为新生代内存空间,由老年代内存组成的内存空间则可以被称为老年代内存空间,对于初次内存分配的对象,通常内存位于新生代内存空间,新生代内存空间通常有较小的容量,进行内存垃圾回收的频率也较高,若新生代内存空间中的对象经历多次内存垃圾回收后仍然存在,则可以将其移动至老年代内存空间当中,由老年代内存存储该对象,老年代内存空间的容量更大,且进行内存垃圾回收的频率更低。
由于虚拟机在应用退出时,会将老年代内存空间进行销毁,销毁的过程中释放了老年代内存空间占用的虚拟内存,通常采用第二内存释放模式,在老年代内存空间的虚拟内存在被释放后,其对应的物理内存可能并不会立即释放,终端设备的操作系统在统计应用消耗的内存时,使用的是应用占用的物理内存,而非虚拟内存,这导致目标应用在释放虚拟内存后仍占用很多物理内存,存在一些物理内存已经使用完成,但是并未及时归还给终端设备的操作系统的情况。
因此,可以在老年代内存空间被销毁时,采用第一内存释放模式,直接将释放的虚拟内存对应的物理内存也进行释放。
如图2所示,为本公开实施例提供的内存处理方法中,第一内存释放模式释放物理内存的步骤的流程图,该步骤首先响应于虚拟机的老年代内存空间销毁指令,遍历老年代内存空间对应的各个虚拟页面的虚拟内存,在遍历过程中,每当遍历到一个新的虚拟页面,就将其对应的虚拟内存释放,并判断是否需要立即释放物理内存,若需要,则确定该虚拟页面的虚拟内存映射的物理内存,并将确定的物理内存释放,直到遍历完成所有的虚拟页面。
这样,通过第一内存释放模式,可以立即将不再需要的物理内存归还给终端设备的操作系统,而不需要等待物理内存释放的时间节点再进行物理内存的释放,缩短虚拟机占用物理内存的时间,从而降低Flutter应用的内存占用。
本公开实施例提供的内存处理方法,首先响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;然后,对所述快照数据进行解析,得到所述快照数据的解析结果;其次,利用所述快照数据的解析结果,启动所述目标应用;之后,在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;同时,针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。本公开实施例通过在快照数据解析完成后,利用第一内存释放模式主动释放快照数据对应的虚拟内存,从而降低虚拟机所占用的虚拟内存,并且,通过第二内存释放模式在内存释放的时间节点对已被释放的虚拟内存对应的物理内存释放,进而降低目标应用所占用的物理内存,优化终端设备运行目标应用时的性能。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与内存处理方法对应的内存处理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述内存处理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图3所示,为本公开实施例提供的一种内存处理装置示意图,所述装置用于虚拟机,包括:
响应模块310,用于响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;
解析模块320,用于对所述快照数据进行解析,得到所述快照数据的解析结果;
启动模块330,用于利用所述快照数据的解析结果,启动所述目标应用;
第一释放模块340,用于在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;
第二释放模块350,用于针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。
一种可选的实施方式中,所述第一释放模块340还用于:
响应于所述虚拟机的老年代内存空间销毁指令,启用所述第一内存释放模式,释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存。
一种可选的实施方式中,所述目标应用为通过dart编程语言编写的应用。
一种可选的实施方式中,所述第一释放模块340在释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存时,用于:
遍历所述老年代内存空间对应的虚拟页面,在遍历到一新虚拟页面时,释放当前遍历到的虚拟页面对应的虚拟内存;
在释放完成一虚拟页面对应的虚拟内存后,立即释放其映射的物理内存。
一种可选的实施方式中,所述快照数据为用于快速启动并发进程的数据。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图1中的内存处理方法,本公开实施例还提供了一种电子设备400,如图4所示,为本公开实施例提供的电子设备400结构示意图,包括:
处理器41、存储器42、和总线43;存储器42用于存储执行指令,包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当所述电子设备400运行时,所述处理器41与所述存储器42之间通过总线43通信,使得所述处理器41执行以下指令:
响应于目标应用的启动指令,将用于加速启动所述目标应用的快照数据加载到虚拟内存中;
对所述快照数据进行解析,得到所述快照数据的解析结果;
利用所述快照数据的解析结果,启动所述目标应用;
在所述快照数据的解析完成后,针对存储所述快照数据的虚拟内存,启用第一内存释放模式,释放存储所述快照数据的虚拟内存,并在释放存储所述快照数据的虚拟内存后,立即释放存储所述快照数据的物理内存;
针对存储所述目标应用的目标类型数据的虚拟内存,启用第二内存释放模式,在释放存储所述目标类型数据的虚拟内存后,在到达物理内存释放的时间节点的情况下,将已被释放的虚拟内存对应的物理内存释放。
一种可选的实施方式中,所述处理器41还用于执行:
响应于所述虚拟机的老年代内存空间销毁指令,启用第一内存释放模式,释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存。
一种可选的实施方式中,所述目标应用为通过dart编程语言编写的应用。
一种可选的实施方式中,所述处理器41执行的指令中,所述释放所述老年代内存空间对应的虚拟内存,并立即释放所述老年代内存空间对应的物理内存,包括:
遍历所述老年代内存空间对应的虚拟页面,在遍历到一新虚拟页面时,释放当前遍历到的虚拟页面对应的虚拟内存;
在释放完成一虚拟页面对应的虚拟内存后,立即释放其映射的物理内存。
一种可选的实施方式中,所述快照数据为用于快速启动并发进程的数据。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的内存处理方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的内存处理方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。