终端内存处理方法、装置及终端的制作方法_2

文档序号:8380888阅读:来源:国知局
处理,因此,该二级缓存区域可以采用并行哈希映射ConcurrentHashMap容器对二级缓存区域内的缓存对象进行缓存。
[0035]在本实施例中还提供了一种终端内存处理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0036]图2是根据本发明实施例的终端内存处理装置的结构框图,如图2所示,该装置包括划分模块22、分级模块24和缓存模块26,下面对装置进行说明。
[0037]划分模块22,用于将终端内存划分为多个缓存区域;分级模块24,连接至上述划分模块22,用于对多个缓存区域进行分级;缓存模块26,连接至上述分级模块24,用于依据分级后的缓存区域对终端内存中的缓存对象进行分级缓存处理。
[0038]图3是根据本发明实施例的终端内存处理装置中划分模块22的结构框图,如图3所示,该划分模块22包括划分单元32,下面对该划分单元32进行说明。
[0039]划分单元32,用于将终端内存划分为一级缓存区域和二级缓存区域,其中,一级缓存区域内的缓存对象禁止被垃圾回收器回收,二级缓存区域内的缓存对象在满足预定存储容量时被垃圾回收器回收。
[0040]图4是根据本发明实施例的终端内存处理装置中缓存模块26的结构框图,如图4所示,该缓存模块26包括判断单元42和转换单元44,下面对该缓存模块26进行说明。
[0041]判断单元42,用于判断一级缓存区域内缓存的对象是否超过预定容量;转换单元44,连接至上述判断单元42,用于在判断单元的判断结果为是的情况下,将一级缓存区域内缓存的缓存对象转换为在二级缓存区域进行缓存。
[0042]图5是根据本发明实施例的终端内存处理装置中缓存模块26中转换单元44的结构框图,如图5所示,该转换单元44包括:排序子单元52和转换子单元54,下面对该转换单元44进行说明。
[0043]排序子单元52,用于对一级缓存区域内的缓存对象依据访问量的多少进行排序;转换子单元54,连接至上述排序子单元52,用于优先将一级缓存区域内访问量少的缓存对象转换为在二级缓存区域内进行缓存。
[0044]在本实施例中,还提供了一种终端,图6是根据本发明实施例的终端的结构框图,如图6所示,该终端60包括上述任一项的终端内存处理装置62。
[0045]像访问磁盘文件、访问网络资源、查询数据库等操作都是影响应用程序执行性能的重要因素,如果能重新获取那些尚未被回收的Java对象的引用,必将减少不必要的访问,大大提高程序的运行速度。因此,在本实施例中基于终端(例如,手机)内存相对紧张同时又对手机应用的用户体验要求很高的矛盾,即在面对手机终端内存一定的情况下,对手机应用的用户响应性与手机应用的健壮性都提出了很高的要求。在本实施例中,在内存一定的前提下做到充分利用现有内存基础上构建应用的二级缓存并且做到有效避免内存缓存OutOfMemoryExcept1n发生。例如,对图片缓存采用该缓存策略后就可以达到很高的用户体验。
[0046]下面对本发明实施例的双缓存方案进行描述,便于以下叙述,以下以终端内存消耗比较突出的图片为例进行说明,该方案主要包括以下几点:1、使用JAVA的强引用构建应用的一级缓存;2、JAVA软引用构建二级缓存;3、借助JAVA提供的LinkHashMap类实现近期最少使用(Least Recently Used,简称为LRU)算法和一级缓存容器;4、在一级与二级缓存之间动态双向转换;5、根据手机终端内存大小动态修改一级缓存大小;6、使用JAVA提供的ConcurrentHashMap实现二级缓存容器;7、提供压缩后缓存策略。
[0047]通过本发明实施例,根据JAVA自有垃圾回收器的特性对需要缓存的对象使用强引用构建的一级缓存,采用软引用构建二级缓存,再根据LRU算法动态转换一、二级缓存中的对象,这样双管齐下,不仅增强了页面浏览的流畅从而大大增强用户体验,并且有效的降低了 OutOfMemoryExcept1n异常发生的机率,从而使我们的应用在如今竞争相当激励移动互联网应用中能够脱颖而出,得到用户的青睐最终赢得市场。
[0048]下面对本发明的优选实施方式进行说明。
[0049]在本优选实施方式中,首先,根据手机终端内存的大小创建一个合适大小的强引用缓存区域,在强引用缓存区域所存放的对象在垃圾回收时不会主动被回收,即只要不主动释放就会贯穿应用的整个生命周期,所以这里的引用缓存就构成上述所说的一级缓存,在一级缓存里存放应用中经常使用到的对象(例如,图片数据)。由于一级缓存的支撑,用户在使用时就不会感觉到应用页面的滞后。但由于物理内存大小限制一级缓存容量是有限的,所以引入采用软引用构建的不限大小的二级缓存区域,软引用区域主要用来存放一级缓存区域根据LRU算法淘汰下来的图片资源,随着应用的运行,从一级缓存淘汰时二级缓存的图片资源将会越来越多,当内存大到超出物理内存总和后就会发生OutOfMemoryExcept1n异常,这样就违背了应用的健壮性。因此,在本优选实施方式中构建的二级缓存采用的JAVA的软引用,根据软引用的特性在JAVA垃圾回收器发生的时候会动态决定是否回收软件用所指对象占用的内存,当内存到达物理内存极限的时候就会强行回收软引用对象所占用的内存,如果尚有足够支撑应用运行内存,垃圾回收器就会忽略软引用对象,由于软引用这个独特性质,所以可以有效避免常见的OutOfMemoryExcept1n异常的发生,这样就大大提高了应用的健壮性。在构建一级缓存的容器时,主要采用了 JAVA提供的LinkHashMap类,之所以采用这样的容器是因为在应用不断使用的时候会不断将后续的图片资源根据LRU算法转移至二级缓存,LinkHashMap该类本身存在一个特性就是可以动态设置属性根据访问高低将容器中的对象进行排序,所以借助这个类只需要实现一级缓存向二级缓存移动的便捷操作,将实现LRU算法难度大大降低。在实现二级缓存时我们采用了 JAVA中提供的ConcurrentHashMap类,由于现在的一般应用都是多线程访问,所以这就要求考虑容器的同步安全问题,当然JAVA中多线程安全的容器还有很多,如Vector、HashTable等,但是这些类实现多线程安装用的整个方法加上内部锁实现,而ConcurrentHashMap采用的是分离锁,所以使用ConcurrentHashMap能够达到更好的吞吐量。在最后对于缓存的对象提供了压缩后缓存策略,这一点可以根据后续的测试充分考虑响应与性能兼顾的前提下决定是否采用压缩后缓存。
[0050]需要说明的是,上述所指的强引用(StrongReference)是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。因此,在本优选实施例中,采用强引用来实现一级缓存,但是当应用从网络中获取网络图片数据时,用户完全有可能做一些重复性的操作去查看相同的图片信息。
[0051]另外,如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。使用软引用(SoftReference)实现二级缓存是非常有必要的一件事情。在处理大量图片的时候,使用软引用技术可以来防止内存溢出。在Android开发中,为了防止内存溢出,在处理一些占用一些内存大而且声明周期较长的对象的时候,可以尽量使用软引用技术。使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间是可以被释放掉的,从而避免内存达到上限,避免内存溢出的发生。
[0052]虽然软引用在内存空间足够的时候使用起来比较方便,而在内存空间不足的时候就不能使用软引用,因为随时都可能被垃圾回收器回收。因此,在Android开发中可以使用LRU+软引用的方法来缓存图片设置两级缓存,第一级用LinkedHashMap〈String, Bitmap)保留Bitmap的强引用,但是控制缓存的大小MAX_CAPACITY=10,当继续向该缓存中存数据的时候,将会把一级缓存中的最近最少使用的元素放入二级缓存ConcurrentHashMap〈Sting, SoftReference〈Bitmap>>, 二级缓存中保留的Bitmap的软引用。
[0053]把图片保存到LRU集合中的时候,同时保存在一个软引用的集合之中,如果此元素被LRU算法删除,可能垃圾回收器还并没有回收,可以通过软引用的集合获取到此引用。
[0054]需要说明的是,LinkedHashMap继承了 HashMap底层是通过Hash表+单向链表实现Hash算法,内部自己维护了一套元素访问顺序的列表。ConcurrentHashMap的并发读写速度很快,主要归功于其内部数据结构和独特的
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1