根据设备功能和可用内存调整LRU Cache的大小

时间:2012-02-22 16:54:18

标签: android caching heap lru

我正在考虑在Android应用中实现我的第一层缓存。 我正在考虑使用SoftReferences来确保避免OOM异常,但由于有很多关于Android如何“过早”解除这些内容的文章,我决定调查android.util.LruCache缓存。

问题:如何为实际设备正确调整大小? 一切听起来很不错LRU缓存是真正的解决方案而不是SoftReferences,但是如果你真的很想避免使用OOM异常,那么使用任意数量的数百万个硬引用都会感到非常不安全。如果你问我,这只是不安全。 无论如何,这似乎是唯一的选择。 我正在研究getMemoryClass以找出实际设备上应用程序的堆大小(+在调整缓存大小之前检查可用堆大小)。基线是16 Megs听起来不错,但是我看过设备(例如过去的G1)抛出OOM异常只有大约5兆字节的堆大小(根据Eclipse MAT)。我知道G1很老了,但重点是我的经验与文档提到的16 Megs基线并不完全一致。因此,我完全不确定如果我需要最合理的话,我应该如何扩展LRU缓存。 (对于8 Megs会很满意,并且在低规格的设备上会小到1兆)

感谢任何提示。

编辑:我指的是Android LRU缓存类:http://developer.android.com/reference/android/util/LruCache.html

2 个答案:

答案 0 :(得分:14)

我认为开发指南中概述了计算LruCache大小的有效解决方案:

int memClass = ( ( ActivityManager )context.getSystemService( Context.ACTIVITY_SERVICE ) ).getMemoryClass();
int cacheSize = 1024 * 1024 * memClass / 8;

可在此处找到更多信息:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

答案 1 :(得分:0)

从你的问题来看,它有点令人困惑,无法理解你在问什么。让我试一试。

各种缓存产品AppFabric,memcached,ncache和scaleout对每个对象都有1M限制。我认为scaleout确实提供了某种定制。

但所有这些都是服务器端产品。因此对于一个Android设备,它最有可能只是一个主机本地缓存,我可能会最多64kb。我的意思是,为什么任何人都需要在设备上每个对象超过64kb。只是我的猜测。

如果我是你,我会学习memcached(最着名的开源缓存解决方案)。并且可能是横向扩展,因为它很容易得到一个hello世界也在扩展。并按比例决定。