【问题标题】:Java - Cache HashMap with dynamic object sizeJava - 使用动态对象大小缓存 HashMap
【发布时间】:2016-02-21 07:45:36
【问题描述】:

我有一张 HashMap 地图,其中 Node 是一个包含一些信息的类,最重要的是包含一个邻居 HashMap。

我的算法从外部 HashMap 随机获取并放入内部 HashMap,例如

Node node = map.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);

我在外部地图和内部地图中都有很多条目。完整的数据集不能单独由内存处理,所以我需要使用一些磁盘缓存。我想尽可能多地使用内存(直到几乎满,或者直到达到我指定的阈值),然后将条目逐出到磁盘。

我使用了几个缓存(主要是 mapDb 和 EhCache)试图解决我的问题,但没有运气。我正在设置最大内存大小,但缓存只是忽略它。 我几乎可以肯定,问题在于我的对象是动态大小的。

有人对我如何处理这个问题有任何想法吗? 提前致谢。

【问题讨论】:

  • 能否告诉我为什么 EhCache 不能帮助你?它是否将数据从内存中逐出到磁盘缓存中?
  • EhCache 驱逐似乎忽略了大小限制。我正在运行 -Xmx1g 并将内存缓存大小设置为 300mb,但一段时间后内存被填满并且 GC 活动过多,从而削弱了我的应用程序。

标签: java caching hashmap ehcache mapdb


【解决方案1】:

注意:我在 Ehcache 工作

与大多数其他缓存产品一样,Ehcache 无法知道您的对象大小正在增长,除非您通过从外部更新映射来告知它:

Node node = cache.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);
cache.put(someInt, node);

在这种情况下,Ehcache 将正确跟踪对象增长并触发内存驱逐。

请注意,Ehcache 不再使用堆和磁盘之间的溢出模型,而是始终将映射存储在磁盘上,同时在堆上保留热集。

【讨论】:

  • 感谢您的回复。我也这样做了。仍然没有运气。我正在运行 -Xmx1g 并将内存缓存大小设置为 300mb,但一段时间后内存被填满并且 GC 活动过多,从而削弱了我的应用程序。我正在使用 EhCache 2.9
  • 您进行了内存转储吗? Ehcache 是负责 GC 活动还是来自您的应用程序的压力?
  • 是的,我通过 VisualVM 进行了堆转储。大多数对象是 byte[] 和 char[] 并且我在我的应用程序中不使用任何这些对象。我猜这些是我的对象的序列化版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2019-07-27
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多