gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:23:44 25 4
gpt4 key购买 nike

我需要使用可用 RAM 的一部分在 Java 中缓存对象。我知道其他人问过这个问题,但没有一个回答符合我的要求。

我的要求是:

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

我尝试了 LinkedHashMap,但它要求您指定最大元素数,而且我不知道需要多少元素才能填满可用 RAM(它们的大小会有很大差异)。

我目前的做法是使用 Google Collection 的 MapMaker 如下:

Map<String, Object> cache = new MapMaker().softKeys().makeMap();

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

我听说过 EHCache 之类的东西,但对于我的需要来说,它似乎相当重,而且我不确定它对于我的应用程序是否足够快(请记住,该解决方案不能比HashMap)。

最佳答案

我对您有类似的要求 - 并发性(在 2 个六核 CPU 上)和 LRU 或类似的 - 并且还尝试了 Guava MapMaker。我发现 softValues() 比 weakValues() 慢得多,但是当内存填满时,两者都让我的应用程序变得异常缓慢。

我尝试了 WeakHashMap,它的问题更小,甚至比通过它的 removeEldestEntry() 方法使用 LinkedHashMap 作为 LRU 缓存更快。

但对我来说最快的是ConcurrentLinkedHashMap这使我的应用程序比我尝试过的任何其他缓存快 3-4 (!!) 倍。快乐,经过几天的挫折!它显然已被合并到 Guava 的 MapMaker 中,但 LRU 功能无论如何都没有在 Guava r07 中。希望它对你有用。

关于java - 如何使用可用 RAM 在 Java 中有效地缓存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2158868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com