【问题标题】:Sizing LRU Cache according to device capabilities and free memory根据设备能力和可用内存调整 LRU 缓存大小
【发布时间】:2012-03-13 01:05:26
【问题描述】:

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

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

感谢任何提示。

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

【问题讨论】:

    标签: android caching heap-memory lru


    【解决方案1】:

    我认为开发指南中概述了计算 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

    【讨论】:

    • 是的,我最终以类似的方式使用了内存类。我仍然觉得这太靠猜测了,但我没有找到更准确的方法。
    • 确保 sizeOf 也返回以字节为单位的大小。在上面的链接中,他们返回了 bitmap.getByteCount() / 1024(以千字节为单位!这当然可以,但是你的 cacheSize 应该是 1024 * memClass / 8)
    【解决方案2】:

    从您的问题来看,您的问题有点令人困惑。让我试一试。

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

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

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

    【讨论】:

    • 嗨 Siddharth, 在 Android 上,缓存(内存和存储)的一个非常典型的目的是缓存列表和缩略图。一个缩略图本身可以很容易地达到 20kbytes,您可以在一个网格中显示 40-50 个缩略图。我说的是兆字节。问题更多是关于从 Android 特定的角度找到合适的尺寸。它与服务器端解决方案无关,因为您知道服务器的硬件,但您不知道运行 Android 应用的所有 70000 种不同的硬件配置。
    • 所以如果我没记错的话,Android 没有比内存慢的辅助存储,对吧?它们都是相同的记忆,主要的和次要的。那么为什么会有人想要 LRU 缓存呢?我想知道?
    • 这里有我要与 LRU 缓存一起使用的 RAM。这是最快的。然后是内部存储,它是下一个最快的。还有可以是任何东西的外部存储,甚至是慢速 SD 卡。我在这里说 RAM 作为我的 L1 缓存。
    • 我 100% 确定我需要使用 RAM。我的问题是针对 Android LRU 缓存(android.util.LruCache)的使用。我需要找到正确的策略来衡量它。市场上有 700 多种不同的硬件配置。所以这不是一个微不足道的问题。
    • 不是,但您需要从某个地方开始。所有产品/功能都从考虑场景开始。你也可以采取这种方法。从您希望为大多数消费者提供支持的场景开始。就像 facebook,或者一个有 5 个屏幕和 30 个移动角色的游戏。调整大小并设置默认值。然后允许配置加载时间和运行时间。能说一下希望支持的场景吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多