用于辅助位图对象内存分配的方法及装置
技术领域
本公开通常涉及图片渲染领域,更具体地,涉及用于辅助位图对象内存分配的方法及装置。
背景技术
内存溢出错误(OOM,Out of Memory)是指应用程序申请内存过大,而应用程序虚拟机无法满足,然后发生系统崩溃。OOM是应用程序开发中经常碰到的现象。这个现象通常出现在大图片类应用程序开发或者需要使用大量图片的应用程序开发中。比如,应用程序从本地文件中读取图片,然后在GridView中进行图片显示,这时,应用程序需要申请内存来存放图片,由于应用程序的每个进程或者应用程序虚拟机具有最大内存限制,一旦应用程序所申请的内存超过最大内存限制,则会发生OOM错误。
位图(Bitmap)对象的尺寸通常比较大,创建一个Bitmap对象会消耗大量的内存。在大图片类应用程序中,需要从本地文件中读取图片,然后在GridView中进行图片渲染。图片渲染操作需要创建大量的Bitmap对象,并且在应用程序Java层的内存堆(例如,Java堆)中为所创建的Bitmap对象分配内存,以存储所绘制的Bitmap对象的像素。在内存堆碎片化严重时,针对位图对象的内存分配操作容易发生OOM错误。如何在Bitmap对象创建时进行内存分配以降低OOM错误发生概率,成为亟待解决的问题。
发明内容
鉴于上述,本公开提供了一种用于辅助位图对象内存分配的方法及装置。利用该方法及装置,通过为位图对象分配原生层的内存空间中的内存来存储对应的像素数据,能够降低OOM错误的发生概率。
根据本公开的一个方面,提供了一种用于辅助位图对象内存分配的方法,包括:获取位图对象在应用程序Java层中的数据结构中的第一地址字段的位置信息,所述位图对象在应用程序原生层的数据结构中的第二地址字段的位置信息和第三地址字段的位置信息以及在所述应用程序Java层的内存空间中创建的第一字节型数组对象的数组对象信息,所述数组对象信息包括内存大小和数据结构信息,所述第一字节型数组对象用于存储所述位图对象的像素数据,所述第一地址字段和所述第二地址字段用于存储所使用的字节型数组对象的虚拟地址,以及所述第三地址字段用于存储全局引用所指向的字节型数组对象的虚拟地址;基于所述第一字节型数组对象的数组对象信息,在所述应用程序原生层的内存空间中创建第二字节型数组对象,所述第二字节型数组对象具有与所述第一字节型数组对象相同的内存大小和数据结构;以及使用所述第二字节型数组对象的虚拟地址覆盖所述第一地址字段、所述第二地址字段和所述第三地址字段处存储的虚拟地址。
可选地,在上述方面的一个示例中,所述第一地址字段的位置信息、所述第二地址字段的位置信息和所述第三地址字段的位置信息使用相对于各自的数据结构的起始位置的偏移量来表示。
可选地,在上述方面的一个示例中,所述方法还可以包括:在所述第一地址字段、所述第二地址字段和所述第三地址字段处存储的虚拟地址被覆盖后,经由应用程序虚拟机执行针对所述第一字节型数组对象的回收操作。
可选地,在上述方面的一个示例中,所述方法还可以包括:在所述第一地址字段、所述第二地址字段和所述第三地址字段处存储的虚拟地址被覆盖后,在所述位图对象被使用时,由应用程序虚拟机使用所述第三地址字段处存储的虚拟地址来创建全局引用。
可选地,在上述方面的一个示例中,所述方法还可以包括:在应用程序虚拟机执行针对所述第二字节型数组对象的虚拟地址的对象地址检查时,使得所述应用程序虚拟机跳过所述对象地址检查。
可选地,在上述方面的一个示例中,使得所述应用程序虚拟机跳过所述对象地址检查可以包括:利用二进制代码注入机制来使得所述应用程序虚拟机跳过所述对象地址检查。
可选地,在上述方面的一个示例中,所述方法还可以包括:在应用程序虚拟机执行针对所述第二字节型数组对象的回收操作时,使得所述应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。
可选地,在上述方面的一个示例中,使得所述应用程序虚拟机使用设定的数组对象回收逻辑来执行针对所述第二字节型数组对象的回收操作可以包括:利用二进制代码注入机制来使得所述应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。
根据本公开的另一方面,提供一种用于辅助位图对象内存分配的装置,包括:获取单元,被配置为获取位图对象在应用程序Java层中的数据结构中的第一地址字段的位置信息,所述位图对象在应用程序原生层的数据结构中的第二地址字段的位置信息和第三地址字段的位置信息以及在所述应用程序Java层的内存空间中创建的第一字节型数组对象的数组对象信息,所述数组对象信息包括内存大小和数据结构信息,所述第一字节型数组对象用于存储所述位图对象的像素数据,所述第一地址字段和所述第二地址字段用于存储所使用的字节型数组对象的虚拟地址,以及所述第三地址字段用于存储全局引用所指向的字节型数组对象的虚拟地址;对象创建单元,被配置为基于所述第一字节型数组对象的数组对象信息,在所述应用程序原生层的内存空间中创建第二字节型数组对象,所述第二字节型数组对象具有与所述第一字节型数组对象相同的内存大小和数据结构;以及地址覆盖单元,被配置为使用所述第二字节型数组对象的虚拟地址覆盖所述第一地址字段、所述第二地址字段和所述第三地址字段处存储的虚拟地址。
可选地,在上述方面的一个示例中,所述第一地址字段的位置信息、所述第二地址字段的位置信息和所述第三地址字段的位置信息使用相对于各自的数据结构的起始位置的偏移量来表示。
可选地,在上述方面的一个示例中,所述装置还可以包括:地址检查判断单元,被配置为判断应用程序虚拟机是否执行针对所述第二字节型数组对象的虚拟地址的对象地址检查;以及地址检查干预单元,被配置为在所述应用程序虚拟机执行针对所述第二字节型数组对象的虚拟地址的对象地址检查时,使得所述应用程序虚拟机跳过所述对象地址检查。
可选地,在上述方面的一个示例中,所述地址检查干预单元被配置为:利用二进制代码注入机制来使得所述应用程序虚拟机跳过所述对象地址检查。
可选地,在上述方面的一个示例中,所述装置还可以包括:对象回收判断单元,被配置为判断应用程序虚拟机是否执行针对所述第二字节型数组对象的回收操作;以及对象回收干预单元,被配置为在所述应用程序虚拟机执行针对所述第二字节型数组对象的回收操作时,使得所述应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。
可选地,在上述方面的一个示例中,所述对象回收干预单元被配置为:利用二进制代码注入机制来使得所述应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。
根据本公开的另一方面,提供一种计算设备,包括:至少一个处理器,以及与所述至少一个处理器耦合的存储器,所述存储器存储指令,当所述指令被所述至少一个处理器执行时,使得所述至少一个处理器执行如上所述的用于辅助位图对象内存分配的方法。
根据本公开的另一方面,提供一种机器可读存储介质,其存储有可执行指令,所述指令当被执行时使得所述机器执行如上所述的用于辅助位图对象内存分配的方法。
附图说明
通过参照下面的附图,可以实现对于本公开内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
图1示出了根据本公开的实施例的位图对象创建系统的方框图;
图2示出了根据本公开的实施例的对象头的一个示例的示意图;
图3示出了根据本公开的实施例的位图对象创建方法的流程图;
图4示出了根据本公开的实施例的位图对象创建过程的一个示例的示意图;
图5示出了根据本公开的实施例的对象地址检查过程的流程图;
图6示出了根据本公开的实施例的对象回收过程的流程图;
图7示出了根据本公开的实施例的位图创建装置的方框图;
图8示出了根据本公开的实施例的位图对象内存分配辅助装置的方框图;
图9示出了根据本公开的实施例的用于辅助位图对象内存分配的计算设备的方框图。
具体实施方式
现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本公开内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
每个函数都有函数地址,执行时函数地址会被载入PC寄存器,CPU按照PC寄存器的地址依次读取指令来执行。术语“二进制代码注入”是指在函数地址A处插入一段代码,并且把被插入代码替换的代码挪到内存中的另一个位置B。被插入的代码会先跳转到用户定义的函数处执行,执行完成后跳回位置B继续执行函数原来的逻辑。由此,通过二进制代码注入的方式可以修改函数原来的执行逻辑。
下面将结合附图来详细描述根据本公开的实施例的用于辅助位图对象内存分配的方法及装置。
图1示出了根据本公开的实施例的位图对象创建系统1的方框图。如图1所示,位图对象创建系统1包括位图创建装置10和位图对象内存分配辅助装置20。
位图创建装置10位于操作系统中,并且被配置为在接收到位图对象创建请求后,创建位图对象。位图创建装置10的位图对象创建过程与常规的位图对象创建过程完全相同。具体地,在接收到位图对象创建请求后,在应用程序Java层中创建位图(下文中简称为“Bitmap”)对象,并且在应用程序Java层的内存空间为所创建的Bitmap对象分配一块内存,在该内存中创建第一字节型数组(下文中称为“byte[]”)对象,该第一byte[]对象用于存储所创建的Bitmap对象的像素数据。通常,byte[]对象可以包括对象头(Object Head)以及对象体。在Object Head中存储Byte[]对象的内存大小以及数据结构信息。图2示出了根据本公开的实施例的对象头的一个示例的示意图。在本公开中,操作系统例如可以是安卓8.0之前的安卓系统。
此外,所创建的Bitmap对象在应用程序Java层中的数据结构包括第一地址字段(也可以称为“第一地址字段”),该第一地址字段用于存储第一byte[]对象的虚拟地址。此外,所创建的Bitmap对象在应用程序原生层(例如,JNI(Java-Native Interface,Java-Native接口)层)的数据结构中具有第二地址字段和第三地址字段。其中,第二地址字段用于存储所使用的byte[]对象的虚拟地址,以及第三地址字段用于存储全局引用(例如,在Bitmap初始创建时所创建的弱全局引用)所指向的byte[]对象的虚拟地址。
位图对象内存分配辅助装置20与位图创建装置10通信,用于辅助位图创建装置10来进行针对所创建的Bitmap对象的像素内存分配。具体地,位图对象内存分配辅助装置20被配置为从位图创建装置10接收所创建的Bitmap对象的第一地址字段、第二地址字段和第三地址字段的位置信息,以及接收第一Byte[]对象的数组对象信息。所述数组对象信息包括第一Byte[]对象的内存大小以及数据结构信息。
然后,位图对象内存分配辅助装置20基于所接收的第一Byte[]对象的数组对象信息,在应用程序原生层(例如,Native层)的内存空间中创建第二Byte[]对象。第二Byte[]对象的内存大小与第一Byte[]对象的内存大小相同,并且第二Byte[]对象的数据结构与第一Byte[]对象的数据结构相同。
接着,位图对象内存分配辅助装置20使用所创建的第二Byte[]对象的虚拟地址来覆盖第一地址字段、第二地址字段和第三地址字段处存储的虚拟地址,由此实现将位于应用程序Java层的内存堆之外的应用程序原生层的内存空间(例如,libc库)中的内存分配给所创建的Bitmap对象。这里,位图对象内存分配辅助装置20可以作为第三方提供的插件安装在操作系统中。
图3示出了根据本公开的实施例的位图对象创建方法的流程图。
如图3所示,首先,在块301,操作系统中的位图创建装置10接收Bitmap对象创建请求。在接收到Bitmap对象创建请求后,在块302,位图创建装置10创建Bitmap对象,所创建的Bitmap对象位于应用程序Java层中。所创建的Bitmap在应用程序Java层中的数据结构具有多个字段,该多个字段至少包括第一地址字段。第一地址字段用于存储第一Byte[]对象的虚拟地址。
接着,在块303,位图创建装置10获取所创建的Bitmap对象的第一地址字段在应用程序Java层的内存空间中的位置信息(下文中称为“第一位置”)。第一位置采用所创建的Bitmap对象在应用程序Java层的内存空间中的起始地址(即,该Bitmap对象的虚拟地址)以及第一地址字段相对于该起始地址的偏移量A来表示。例如,可以通过操作系统(例如,安卓系统)所提供的API UnsafeProxy来获取Bitmap对象的虚拟地址以及偏移量A。
然后,在块304,位图创建装置10获取第一地址字段中存储的第一Byte[]对象的地址信息,并且在块305,位图创建装置10基于所获取的第一Byte[]对象的虚拟地址信息,获取第一Byte[]对象的数组对象信息,比如,Byte[]对象的内存大小、数据结构等。第一Byte[]对象的数组对象信息通常存储在第一Byte[]对象的对象头部(Object Head)中。
随后,在块306,位图创建装置10基于第一Byte[]对象的虚拟地址信息,获取所述Bitmap对象在应用程序原生层(例如,JNI层)的内存空间中的数据结构的第二地址字段的位置信息(下文中称为“第二位置”),以及所述Bitmap对象在应用程序原生层的内存空间中的数据结构的第三地址字段的位置信息(下文中称为“第三位置”)。例如,通过第一Byte[]对象的虚拟地址,进行反向搜索得到第二位置。第二位置可以采用第二地址字段相对于所述Bitmap对象在应用程序原生层的内存空间中的数据结构的起始地址的偏移量B来表示。第三位置可以采用第三地址字段相对于所述Bitmap对象在应用程序原生层的内存空间中的数据结构的起始地址的偏移量C来表示。这里,第二地址字段用于存储所使用的byte[]对象的虚拟地址,以及第三地址字段用于存储全局引用(例如,在Bitmap初始创建时所创建的弱全局引用)所指向的byte[]对象的虚拟地址。
在如上获得第一位置A、第二位置B、第三位置C以及第一Byte[]对象的数组对象信息后,在块307,将第一位置A、第二位置B、第三位置C以及第一Byte[]对象的数组对象信息发送给位图对象内存分配辅助装置20。
在接收到第一位置A、第二位置B、第三位置C以及第一Byte[]对象的数组对象信息后,在块308,位图对象内存分配辅助装置20在应用程序原生层(例如,“Native层”)的内存空间中创建第二Byte[]对象,所创建的第二Byte[]对象的内存大小与第一Byte[]对象的内存大小相等,以及第二Byte[]对象的数据结构与第一Byte[]对象的数据结构相同。
然后,在块309,位图对象内存分配辅助装置20使用所创建的第二Byte[]对象的虚拟地址(即,第二虚拟地址)来覆盖第一位置A、第二位置B和第三位置C处存储的虚拟地址(即,第一虚拟地址)。
在第一位置A、第二位置B和第三位置C处存储的虚拟地址被覆盖后,在块310,位图创建装置10回收第一Byte[]对象,以释放对应的内存空间。
此外,在所创建的Bitmap对象被使用时,位图创建装置10还可以基于第三地址字段中存储的第二虚拟地址来创建全局引用GlobalRef,并且使得所创建的GlobalRef指向第二Byte[]对象的虚拟地址。
图4示出了根据本公开的实施例的Bitmap对象创建过程的一个示例的示意图。
如图4所示,在接收到Bitmap对象创建请求后,操作系统中的位图创建单元10在Java层创建Bitmap对象以及第一Byte[]对象,该Bitmap对象的数据结构具有多个字段。该多个字段至少包括第一地址字段,该第一地址字段存储第一Byte[]对象的第一虚拟地址。这里,第一Byte[]对象是由操作系统在Java层的内存空间中为该Bitmap对象分配的内存块中创建的,用于存储该Bitmap对象的像素数据。此外,位图创建单元10还在JNI层创建与Bitmap对象对应的数据结构,该数据结构具有第二地址字段和第三地址字段。第二地址字段用于存储所使用的byte[]对象的虚拟地址,以及第三地址字段用于存储全局引用(例如,在Bitmap初始创建时所创建的弱全局引用)所指向的byte[]对象的虚拟地址。相应地,位图创建单元10将第一Byte[]对象的第一虚拟地址记录在第二地址字段和第三地址字段中。
然后,位图创建单元10将第一地址字段的位置信息(即,第一位置A)、第二地址字段的位置信息(即,第二位置B)、第三地址字段的位置信息(即,第三位置C)以及第一Byte[]对象的数组对象信息提供给位图对象内存分配辅助单元20。位图对象内存分配辅助单元20使用第一Byte[]对象的数组对象信息来在Native层的内存空间中创建第二Byte[]对象,该第二Byte[]对象具有与第一Byte[]对象相同的内存大小和数据结构。然后,位图对象内存分配辅助单元20使用第二Byte[]对象的虚拟地址来覆盖第一位置A、第二位置B和第三位置C处存储的虚拟地址,由此使得在Bitmap被使用时可以按照实线所指示的引用关系来进行byte[]对象引用。
图5示出了根据本公开的实施例的对象地址检查过程500的流程图。
如图5所示,在块510,在应用程序虚拟机(例如,Java虚拟机)处监测是否执行Byte[]对象地址检查。如果未监测到执行Byte[]对象地址检查,则返回到块510,继续进行Byte[]对象地址检查监测。
如果监测到应用程序虚拟机执行Byte[]对象地址检查,则在块520,应用程序虚拟机确定所检查的Byte[]对象是否是由位图创建装置10创建的第一Byte[]对象。如果所检查的对象是应用程序虚拟机创建的第一Byte[]对象,则在块530,使得应用程序虚拟机执行Byte[]对象地址检查。
如果所检查的对象不是第一Byte[]对象,则触发在位图对象内存分配辅助装置20处的对象地址检查处理过程。具体地,在块540,在位图对象内存分配辅助装置20处,判断所检查的Byte[]对象是否是第二Byte[]对象(即,位图对象内存分配辅助装置20所创建的Byte[]对象)。如果是第二Byte[]对象,则在块550,使得应用程序虚拟机跳过对象地址检查。例如,可以经由位图对象内存分配装置20利用二进制代码注入机制来使得应用程序虚拟机跳过对象地址检查。如果不是第二Byte[]对象,则在块560,使得应用程序虚拟机确定对象地址检查错误(地址检查异常)。
图6示出了根据本公开的实施例的对象回收过程600的流程图。
如图6所示,在块610,在应用程序虚拟机(例如,Java虚拟机)处监测是否执行Byte[]对象回收。如果未监测到执行Byte[]对象回收,则返回到块610,继续进行对象回收监测。
如果监测到应用程序虚拟机执行对象回收,则在块620,确定所回收的对象是否是由位图创建装置10创建的第一Byte[]对象。如果所回收的对象是第一Byte[]对象,则在块630,使得应用程序虚拟机按照固有的回收逻辑执行Byte[]对象回收。
如果所回收的对象不是第一Byte[]对象,则触发在位图对象内存分配辅助装置20处的对象回收处理过程。具体地,在块640,在位图对象内存分配辅助装置20处,判断所回收的Byte[]对象是否是第二Byte[]对象。如果是第二Byte[]对象,则在块650,使得应用程序虚拟机按照预置的对象回收逻辑执行对象回收操作。例如,可以经由位图对象内存分配装置20利用二进制代码注入机制来使得应用程序虚拟机按照预置的对象回收逻辑执行对象回收操作。例如,通过二进制代码注入来在应用程序虚拟机中注入一段预置的对象回收逻辑,然后利用二进制代码注入来执行该预置的对象回收逻辑。如果不是第二Byte[]对象,则进行到块630,使得应用程序虚拟机按照固有对象回收逻辑执行对象回收,或者流程结束。
如上参照图1到图5对根据本公开的用于辅助位图对象内存分配的方法进行描述。利用该方法,通过在原生层的内存空间中为所创建的Bitmap分配相同大小的内存块并在该内存块创建与系统所分配的第一Byte[]对象具有相同数据结构的第二Byte[]对象,然后使用所创建的第二Byte[]对象的第二虚拟地址来替换Bitmap对象在Java层的数据结构中的第一地址字段中的第一虚拟地址,以及Bitmap对象在JNI层的数据结构中的第二地址字段和第三地址字段中的第一虚拟地址,由此使得Bitmap对象在被使用时指向所创建的第二Byte[]对象,进而使用第二byte[]对象来存储对应的像素数据,而无需使用应用程序Java层中的内存(例如,Java堆内的内存),从而降低OOM错误的发生概率。
图7示出了根据本公开的实施例的位图创建装置700的方框图。如图7所示,位图创建装置700包括请求接收单元710、对象创建单元720、位置获取单元730、地址获取单元740、对象信息获取单元750和发送单元760。
请求接收单元710被配置为接收Bitmap对象创建请求。在接收到Bitmap对象创建请求后,对象创建单元720创建Bitmap对象,所创建的Bitmap对象具有位于应用程序Java层中的数据结构以及位于应用程序原生层中的数据结构。所创建的Bitmap对应在应用程序Java层中的数据结构具有多个字段,该多个字段至少包括第一地址字段。第一地址字段用于存储第一Byte[]对象的虚拟地址。
接着,位置获取单元730获取所创建的Bitmap对象的第一地址字段在应用程序Java层的内存空间中的位置信息(下文中称为“第一位置”)。第一位置可以采用对应的内存空间地址来表示,也可以采用所创建的Bitmap对象在应用程序Java层的内存空间中的数据结构的起始地址以及第一地址字段相对于该起始地址的偏移量A来表示。
然后,地址获取单元740获取第一地址字段中存储的第一Byte[]对象的地址信息,并且对象信息获取单元750基于所获取的第一Byte[]对象的虚拟地址信息,获取第一Byte[]对象的数组对象信息,比如,Byte[]对象的内存大小、数据结构等。
随后,位置获取单元730基于第一Byte[]对象的虚拟地址信息,获取所创建的Bitmap对象在应用程序原生层(例如,JNI层)的内存空间中的数据结构的第二地址字段的位置信息(下文中称为“第二位置”),以及所创建的Bitmap对象在应用程序原生层(例如,JNI层)的内存空间中的数据结构的第三地址字段的位置信息(下文中称为“第三位置”)。第二位置可以采用对应的内存空间地址来表示,也可以采用第二地址字段相对于所创建的Bitmap对象在应用程序原生层的内存空间中的数据结构的起始地址的偏移量B来表示。第三位置可以采用对应的内存空间地址来表示,也可以采用第三地址字段相对于所创建的Bitmap对象在应用程序原生层的内存空间中的数据结构的起始地址的偏移量C来表示。
在如上获得第一位置A、第二位置B、第三位置C以及第一Byte[]对象的数组对象信息后,发送单元660将第一位置A、第二位置B、第三位置C以及第一Byte[]对象的数组对象信息发送给位图对象内存分配辅助装置20,以辅助进行位图对象内存分配。
图8示出了根据本公开的实施例的位图对象内存分配辅助装置800的方框图。如图8所示,位图对象内存分配辅助装置800包括获取单元810、对象创建单元820和地址覆盖单元830。
获取单元810被配置为获取所创建的位图对象在应用程序Java层中的数据结构中的第一地址字段的位置信息,所述位图对象在应用程序原生层的数据结构中的第二地址字段的位置信息和第三地址字段的位置信息以及在所述应用程序Java层的内存空间中创建的第一字节型数组对象的数组对象信息,所述数组对象信息包括内存大小和数据结构信息,所述第一字节型数组对象用于存储所述位图对象的像素数据,所述第一地址字段和所述第二地址字段用于存储所使用的字节型数组对象的虚拟地址,以及所述第三地址字段用于存储全局引用所指向的字节型数组对象的虚拟地址。
对象创建单元820被配置为基于所述第一字节型数组对象的数组对象信息,在应用程序原生层的内存空间中创建第二字节型数组对象,第二字节型数组对象具有与第一字节型数组对象相同的内存大小和数据结构。
地址覆盖单元830被配置为使用第二字节型数组对象的虚拟地址覆盖第一地址字段、第二地址字段和第三地址字段处存储的虚拟地址。
此外,在本公开的一个示例中,第一地址字段的位置信息、第二地址字段的位置信息和第三地址字段的位置信息可以使用相对于各自的数据结构的起始位置的偏移量来表示。
此外,可选地,位图对象内存分配辅助装置800还可以包括地址检查判断单元840和地址检查干预单元850。地址检查判断单元840被配置为判断应用程序虚拟机是否执行针对第二字节型数组对象的虚拟地址的对象地址检查。地址检查干预单元850被配置为在应用程序虚拟机执行针对第二字节型数组对象的第二虚拟地址的对象地址检查时,使得应用程序虚拟机跳过所述对象地址检查。例如,地址检查干预单元850可以被配置为:利用二进制代码注入机制来使得应用程序虚拟机跳过所述对象地址检查。
此外,可选地,位图对象内存分配辅助装置800还可以包括对象回收判断单元860和对象回收干预单元870。对象回收判断单元860被配置为判断应用程序虚拟机是否执行针对第二字节型数组对象的回收操作。对象回收干预单元870被配置为在应用程序虚拟机执行针对第二字节型数组对象的回收操作时,使得应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。这里,所述预置的数组对象回收逻辑是由第三方提供的数组对象回收逻辑,其不同于操作系统的数字对象回收逻辑。例如,对象回收干预单元870可以被配置为:利用二进制代码注入机制来使得应用程序虚拟机按照预置的数组对象回收逻辑执行回收操作。
这里要说明的是,在本公开的示例中,地址检查判断单元840和对象回收判断单元860可以采用相同的判断单元或者不同的判断单元来实现。
如上参照图1到图8,对根据本公开的用于辅助位图对象内存分配的方法及装置的实施例进行了描述。上面的位图对象内存分配辅助装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。
图9示出了根据本公开的实施例的用于辅助位图对象内存分配的计算设备900的硬件结构图。如图9所示,计算设备900可以包括至少一个处理器910、存储器(例如,非易失性存储器)920、内存930和通信接口940,并且至少一个处理器910、存储器920、内存930和通信接口940经由总线960连接在一起。至少一个处理器910执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器910:获取位图对象在应用程序Java层中的数据结构中的第一地址字段的位置信息,所述位图对象在应用程序原生层的数据结构中的第二地址字段的位置信息和第三地址字段的位置信息以及在所述应用程序Java层的内存空间中创建的第一字节型数组对象的数组对象信息,所述数组对象信息包括内存大小和数据结构信息,第一字节型数组对象用于存储位图对象的像素数据,第一地址字段和第二地址字段用于存储所使用的字节型数组对象的虚拟地址,以及第三地址字段用于存储全局引用所指向的字节型数组对象的虚拟地址;基于第一字节型数组对象的数组对象信息,在应用程序原生层的内存空间中创建第二字节型数组对象,第二字节型数组对象具有与第一字节型数组对象相同的内存大小和数据结构;以及使用第二字节型数组对象的第二虚拟地址覆盖第一地址字段、第二地址字段和第三地址字段处存储的虚拟地址。
应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器910进行本公开的各个实施例中以上结合图1-8描述的各种操作和功能。
在本公开中,计算设备900可以包括但不限于:个人计算机、服务器计算机、工作站、桌面型计算机、膝上型计算机、笔记本计算机、移动计算设备、智能电话、平板计算机、蜂窝电话、个人数字助理(PDA)、手持装置、消息收发设备、可佩戴计算设备、消费电子设备等等。
根据一个实施例,提供了一种比如机器可读介质(例如,非暂时性机器可读介质)的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本公开的各个实施例中以上结合图1-8描述的各种操作和功能。具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD-RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。
需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,FPGA或ASIC)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。
上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。