12

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

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

感谢您的任何提示。

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

4

2 回答 2

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

于 2012-05-03T15:52:43.587 回答
0

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

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

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

如果我是你,我会研究 memcached(最著名的开源缓存解决方案)。并且可能是横向扩展,因为它也很容易获得一个与横向扩展一起工作的 hello world。并按比例决定。

于 2012-02-22T18:12:22.853 回答