一种内存空间分配方法及装置与流程

文档序号:13182483阅读:118来源:国知局
技术领域本发明涉及计算机技术领域,尤其涉及一种内存空间分配方法及装置。

背景技术:
目前,安卓(Android)应用程序在运行中是基于Java语言层进行数据存储的,在该语言层进行数据存储时会有一定的内存限制,一般限制大小为16MB或24MB。当应用程序涉及到多媒体资源的资源处理时,会消耗大量的内存资源,很容易超过该内存限制,引发应用程序可用内存耗尽(OutOfMemory,OOM),导致程序异常退出。现有的解决方案一般采用缓存、压缩图像、降低图像质量等手段来减少内存占用。这些减少内存占用的方式都是基于对应用程序输出的待存储数据进行处理来实现的,无法从本质上提高应用程序的可用内存。

技术实现要素:
本发明实施例提供一种内存空间分配方法及装置,用以突破应用程序的内存限制,提高应用程序的可用内存。本发明实施例提供一种内存空间分配方法,该方法应用于安装有安卓Android操作系统的终端,包括:在运行应用的过程中,生成第一编程语言层的待存储数据;所述第一编程语言层为Java层;在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,为所述待存储数据分配基于第二编程语言层的内存空间;所述第二编程语言层为Native层;在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间。可选地,在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间之后,还包括:在所述第二编程语言层,将分配的所述内存空间转换为字符串形式的句柄反馈到第一编程语言层,并保存该句柄与所述内存空间的对应关系;在所述第一编程语言层,当需要从内存中读取所述待存储数据时,将包括所述句柄的内存访问指令指示给所述第二编程语言层;在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据反馈到所述第一编程语言层。可选地,将所述句柄对应的内存空间中的数据反馈到所述第一编程语言层之后,还包括:在所述第一编程语言层,将包括所述句柄的内存释放指令指示给所述第二编程语言层;在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,删除所述句柄对应的内存空间中的数据。可选地,在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间,包括:在所述第二编程语言层,将所述待存储数据进行序列化处理后后写入分配的所述内存空间;在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据反馈到所述第一编程语言层,包括:在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据进行反序列化处理后反馈到所述第一编程语言层。可选地,在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,为所述待存储数据分配基于第二编程语言层的内存空间,包括:在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,通过定义的第一编程语言层的存储接口,调用定义的第二编程语言层的存储接口,为所述待存储数据分配基于第二编程语言层的内存空间。本发明实施例提供一种内存空间分配装置,该装置应用于安装有安卓Android操作系统的终端,包括:生成模块,用于在运行应用的过程中,生成第一编程语言层的待存储数据;所述第一编程语言层为Java层;分配模块,用于在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,为所述待存储数据分配基于第二编程语言层的内存空间;所述第二编程语言层为Native层;写入模块,用于在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间。本发明实施例在采用Android操作系统运行应用的过程中,生成Java层的待存储数据后,若该应用当前在Java层能够利用的内存占比低于设定阈值,则为待存储数据分配基于Native层的内存空间,并在Native层,将待存储数据写入分配的内存空间。可见,本发明实施例使应用的可用内存不仅限于Java层,当应用在Java层的可用内存占比低于设定阈值后,可在Native(通过C或C++语言实现)层为该应用分配内存空间,从而极大地减少了发生OOM的几率,大大提高了应用的健壮性。附图说明图1为本发明实施例一提供的内存空间分配方法流程图;图2为本发明实施例二提供的内存空间分配方法流程图;图3为本发明实施例提供的内存空间分配装置结构示意图。具体实施方式本发明实施例的基本思想是:在采用Android操作系统运行应用的过程中,生成Java层的待存储数据后,若该应用当前在Java层能够利用的内存占比低于设定阈值,则为待存储数据分配基于Native层的内存空间,并在Native层,将待存储数据写入分配的内存空间。可见,本发明实施例使应用的可用内存不仅限于Java层,当应用在Java层的可用内存占比低于设定阈值后,可在Native(通过C或C++语言实现)层为该应用分配内存空间,从而极大地减少了发生OOM的几率,大大提高了应用的健壮性。下面结合说明书附图对本发明实施例作进一步详细描述。如图1所示,为本发明实施例一提供的内存空间分配方法流程图,该方法应用于安装有安卓(Android)操作系统的终端,包括以下步骤:S101:在运行应用的过程中,生成第一编程语言层的待存储数据;所述第一编程语言层为Java层。比如,安卓(Android)应用程序是基于Java语言实现的,在运行过程中,需要在Java层将数据写入内存。这里的Java层即所述第一编程语言层。S102:在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,为所述待存储数据分配基于第二编程语言层的内存空间;所述第二编程语言层为Native层。比如,在Java层监测内存消耗;具体的,可以在Java层定义一个接口如StringSaveObject(Object),当Java层需要存储数据时,调用该接口,通过使用ActivityManager的getProcessMemoryInfo方法获取Java层内存消耗。在具体实施中,当确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,可以通过定义的第一编程语言层的存储接口,调用定义的第二编程语言层的存储接口,为所述待存储数据分配基于第二编程语言层的内存空间。比如,通过Java-Native界面(JavaNativeInterface,JNI)定义Java层的存储接口NativestringputToNative(Objectobj);定义Native层的存储接口jstringandroid_jni_putToNative(JNIEnv*env,jobjectobject;在Java层发现可用内存占比低于设定阈值(比如20%)时,通过Java层的存储接口调用Native层的存储接口(即JNI接口),在Native层为应用分配内存。S103:在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间。该步骤中,当在Native层为应用的待存储数据分配好内存空间后,将待存储数据写入分配好的Native层内存空间。下面通过一个具体的实施例对本发明思想作进一步详细描述。如图2所示,为本发明实施例二提供的内存空间分配方法流程图,包括以下步骤:S201:在运行应用的过程中,生成第一编程语言层的待存储数据。具体地,针对基于Java语言的安卓应用,在应用运行中,生成Java层的待存储数据。S202:在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,通过定义的第一编程语言层的存储接口,调用定义的第二编程语言层的存储接口,为所述待存储数据分配基于第二编程语言层的内存空间。具体地,当Java层需要存储数据时,调用定义的内存监测接口StringSaveObject(Object),通过使用ActivityManager的getProcessMemoryInfo方法获取Java层内存消耗。在JAVA层发现可用内存占比低于设定阈值(比如20%)时,通过JAVA层的存储接口NativestringputToNative(Objectobj)调用Native层的存储接口jstringandroid_jni_putToNative(JNIEnv*env,jobjectobject,在Native层为应用分配内存。S203:在所述第二编程语言层,将所述待存储数据进行序列化处理后写入分配的所述内存空间;并,将分配的所述内存空间转换为字符串形式的句柄反馈到第一编程语言层,并保存该句柄与所述内存空间的对应关系。具体地,在Native层,使用序列化(Serializable)接口将待存储数据进行序列化处理,然后使用new操作分配Native内存,将序列化后的数据存储到Native内存,将Native内存地址转化为字符串(string)后作为句柄(Handle)返回给Java层。在Native层,通过JNI建立句柄和内存空间的对应关系表,其中保存句柄和内存空间的对应关系,内存空间具体可以用保存的内存起始地址(Native地址)和内存长度来表示。S204:在所述第一编程语言层,当需要从内存中读取所述待存储数据时,将包括所述句柄的内存访问指令指示给所述第二编程语言层。具体地,在Java层定义访问接口NativeObjectgetFromNative(Stringhandle),通过该访问接口调用Native层访问接口,使用返回的句柄访问之前写入Native层内存的存储数据,S205:在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据进行反序列化处理后反馈到所述第一编程语言层。具体地,在Native层,通过JNI,查询保存的句柄和内存空间的对应关系表,查找到该句柄对应的Native内存空间,读取该内存空间中的数据,并调用Java的Serializable接口对读取的数据进行反序列化处理后返回给Java层。S206:在所述第一编程语言层,将包括所述句柄的内存释放指令指示给所述第二编程语言层。具体地,当需要释放内存时,Java层使用返回的句柄调用释放接口释放在Native层的存储内容。S207:在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,删除所述句柄对应的内存空间中的数据。具体地,通过JNI,查询保存的句柄和内存空间的对应关系表,查找到该句柄对应的Native内存空间,使用delete操作释放查找到的Native内存空间。采用本发明实施例,可在Native(通过C或C++语言实现)层为应用分配内存空间,从而可以减少发生OOM的几率,提高应用的健壮性。比如,当基于Java语言的应用使用了大量的图片,为了操作流畅,需要保存大量的位图(bitmap)数据,此时Java层可用内存受限,可以采用本发明实施例,将大量的bitmap数据通过定义的存储接口保存在Native层内存中。基于同一发明构思,本发明实施例中还提供了一种与内存空间分配方法对应的内存空间分配装置,由于该装置解决问题的原理与本发明实施例内存空间分配方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。如图3所示,为本发明实施例提供的内存空间分配装置结构示意图,该装置应用于安装有安卓Android操作系统的终端,包括:生成模块31,用于在运行应用的过程中,生成第一编程语言层的待存储数据;所述第一编程语言层为Java层;分配模块32,用于在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,为所述待存储数据分配基于第二编程语言层的内存空间;所述第二编程语言层为Native层;写入模块33,用于在所述第二编程语言层,将所述待存储数据写入分配的所述内存空间。可选地,所述写入模块33还用于,在将所述待存储数据写入分配的所述内存空间之后,在所述第二编程语言层,将分配的所述内存空间转换为字符串形式的句柄反馈到第一编程语言层,并保存该句柄与所述内存空间的对应关系;所述装置还包括:读取模块34,用于在所述第一编程语言层,当需要从内存中读取所述待存储数据时,将包括所述句柄的内存访问指令指示给所述第二编程语言层;在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据反馈到所述第一编程语言层。可选地,所述装置还包括:内存释放模块35,用于在所述第一编程语言层,将包括所述句柄的内存释放指令指示给所述第二编程语言层;在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,删除所述句柄对应的内存空间中的数据。可选地,所述写入模块33具体用于:在所述第二编程语言层,将所述待存储数据进行序列化处理后后写入分配的所述内存空间;所述读取模块34具体用于:在所述第二编程语言层,根据保存的句柄与内存空间的对应关系,将所述句柄对应的内存空间中的数据进行反序列化处理后反馈到所述第一编程语言层。可选地,所述分配模块32具体用于:在确定所述应用当前在第一编程语言层能够利用的内存占比低于设定阈值后,通过定义的第一编程语言层的存储接口,调用定义的第二编程语言层的存储接口,为所述待存储数据分配基于第二编程语言层的内存空间。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1