相关疑难解决方法(0)

您将如何在Java中实现LRU缓存?

请不要说EHCache或OSCache等.为了这个问题的目的,假设我只想使用SDK(从实践中学习)来实现我自己的.鉴于缓存将在多线程环境中使用,您将使用哪些数据结构?我已经使用LinkedHashMapCollections#synchronizedMap实现了一个,但我很好奇任何新的并发集合是否会更好.

更新:当我发现这个金块时,我只是阅读Yegge的最新消息:

如果您需要持续时间访问并希望维护插入顺序,那么您不能比LinkedHashMap做得更好,这是一个真正精彩的数据结构.它可能更精彩的唯一方法是如果有并发版本.可惜.

在我使用上面提到的LinkedHashMap+ Collections#synchronizedMap实现之前,我的想法几乎完全相同.很高兴知道我不只是忽略了一些东西.

基于到目前为止的答案,对于高度并发的LRU来说,我最好的选择是使用一些相同的逻辑来扩展ConcurrentHashMapLinkedHashMap.

java caching lru data-structures

167
推荐指数
8
解决办法
12万
查看次数

如何使用可用RAM有效地在Java中缓存对象?

我需要使用一定比例的可用RAM来缓存Java中的对象.我知道其他人已经提出了这个问题,但没有一个回复符合我的要求.

我的要求是:

  • 简单轻巧
  • 并不比普通的HashMap慢得多
  • 使用LRU或一些近似LRU的删除策略

我尝试使用LinkedHashMap,但是它要求你指定最大数量的元素,我不知道填充可用RAM需要多少元素(它们的大小会有很大差异).

我目前的方法是使用Google Collection的MapMaker,如下所示:

Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Run Code Online (Sandbox Code Playgroud)

这看起来很有吸引力,因为它应该在需要更多RAM时自动删除元素,但是存在一个严重的问题:它的行为是填满所有可用的RAM,此时GC开始抖动,整个应用程序的性能急剧恶化.

我听说过像EHCache这样的东西,但它对于我需要的东西似乎相当重,而且我不确定它是否足够快我的应用程序(记住解决方案不能比HashMap慢得多) .

java caching soft-references guava

25
推荐指数
1
解决办法
1万
查看次数

Java固定内存映射

是否有一个简单,高效的Map实现,允许地图使用内存限制.

我的用例是我想动态分配创建时可用的大部分内存,但我不希望OutOFMemoryError在将来的任何时候.基本上,我想使用这个地图作为缓存,但我想避免繁重的缓存实现,如EHCache.我的需求很简单(最多一个LRU算法)

我应该进一步澄清我的缓存中的对象是char[]或类似的原语,它们不会保存对其他对象的引用.

我可以为每个条目设置最大大小的上限.

java caching dictionary memory-management fixed

13
推荐指数
3
解决办法
3702
查看次数

什么是数据结构类似哈希表,但不常使用的键被删除?

我正在寻找一个类似于哈希表的数据结构,但表中有一个大小限制.当散列中的项数达到大小限制时,应调用剔除函数以消除表中检索次数最少的键/值对.

这是我正在研究的一些伪代码:

class MyClass {
  private Map<Integer, Integer> cache = new HashMap<Integer, Integer>();
  public int myFunc(int n) {
    if(cache.containsKey(n))
      return cache.get(n);
    int next = . . . ; //some complicated math.  guaranteed next != n.
    int ret = 1 + myFunc(next);
    cache.put(n, ret);
    return ret;
  }
}
Run Code Online (Sandbox Code Playgroud)

什么情况是,有一些价值n的,其myFunc()将被称为很多次,但许多其他值n将只计算一次.因此,缓存可以填满数百万个永远不需要的值.我想有一种方法让缓存自动删除不经常检索的元素.

这感觉就像一个必须解决的问题,但我不确定数据结构是什么,我将用它来有效地做到这一点.谁能指出我正确的方向?


更新我知道这必须是一个已经解决的问题.它被称为LRU Cache,通过扩展LinkedHashMap类很容易实现.以下是包含该解决方案的代码:

class MyClass {
  private final static int SIZE_LIMIT = 1000;
  private Map<Integer, Integer> cache =
    new LinkedHashMap<Integer, Integer>(16, 0.75f, true) {
      protected …
Run Code Online (Sandbox Code Playgroud)

java algorithm caching data-structures

11
推荐指数
1
解决办法
1719
查看次数

SoftReference太早收集垃圾

我正在为我的Android应用程序实现缓存机制.

我用过SoftReference,就像我发现的许多例子一样.问题是,当我向上或向下滚动时ListView,大部分图像已被清除.我可以在LogCat中看到每次应用程序加载新图像时我的应用程序都是垃圾回收.这意味着大部分不可见的图像ListView都消失了.

因此,每次我回滚到较早的位置(之前我真的下载过图像)我必须再次下载图像 - 它们不会被 缓存.

我也研究过这个话题.根据Mark Murphy在本文中的说法,似乎存在(或者是?)一个bug SoftReference.一些其他结果表明相同的事情(或相同的结果); SoftReference太早被清除了.

有没有可行的解决方案?

java android garbage-collection soft-references

10
推荐指数
2
解决办法
3646
查看次数

Java Collection实现了元素的超时

是否有一些集合实现支持元素到期.

例如:

Collection<User> cachedUsers = new ExpirableList<User>(10000);
Run Code Online (Sandbox Code Playgroud)

哪里

public ExpirableList(final long timeout){...}
Run Code Online (Sandbox Code Playgroud)

在给定时间之后(10000ms在此特定示例中),将从集合中移除添加的元素.通过使用它,我们将防止我们的cachedUsers集合溢出.

java collections

8
推荐指数
1
解决办法
1万
查看次数

部分继承Java中的接口?

我想实现一个简单的Cache接口:

public interface Cache {
    Object get(Object key);
    Object put(Object key, Object value);
    void clear();
}
Run Code Online (Sandbox Code Playgroud)

我意识到它是java.util.Map接口的一部分.因此,像HashMap这样的对象应该能够传递给需要Cache对象的函数.

但另一方面,我不想让我自己的Cache类实现整个Map接口,因为除了这三个之外我不需要其他方法.

Java不是一种鸭式语言,那么在这种情况下最好的做法是什么?

java oop

6
推荐指数
1
解决办法
108
查看次数