具有动态对象大小的Java缓存哈希映射

具有动态对象大小的Java缓存哈希映射,java,caching,hashmap,ehcache,mapdb,Java,Caching,Hashmap,Ehcache,Mapdb,我有一个HashMap的映射,其中Node是一个包含一些信息的类,最重要的是包含一个HashMap 我的算法从外部HashMap进行随机获取,然后放入内部HashMap,例如 Node node = map.get(someInt); node.getNeighbors().put(someInt, someOtherInt); 我在外部地图和内部地图中都有很多条目。完整的数据集不能单独由内存处理,因此我需要使用一些磁盘缓存。我希望尽可能多地使用内存(直到内存几乎满了,或者达到我指定的阈值)

我有一个HashMap的映射,其中Node是一个包含一些信息的类,最重要的是包含一个HashMap

我的算法从外部HashMap进行随机获取,然后放入内部HashMap,例如

Node node = map.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);
我在外部地图和内部地图中都有很多条目。完整的数据集不能单独由内存处理,因此我需要使用一些磁盘缓存。我希望尽可能多地使用内存(直到内存几乎满了,或者达到我指定的阈值),然后将条目逐出到磁盘

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

有人知道我如何处理这个问题吗?
提前感谢。

注意:我在Ehcache上工作

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

Node node = cache.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);
cache.put(someInt, node);
在这种情况下,Ehcache将正确跟踪对象增长并触发内存收回


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

可以告诉我为什么Ehcache不能帮助您吗?它是否将数据从内存中移出磁盘缓存?EhCache移出似乎忽略了大小限制。我正在使用-Xmx1g运行,并将内存缓存大小设置为300mb,但是过了一段时间内存就被填满了,并且GC活动太多,使我的应用程序瘫痪。谢谢你的回复。我也这样做过。还是不走运。我使用-Xmx1g运行,并将内存缓存大小设置为300mb,但一段时间后,内存被填满,GC活动过多,导致我的应用程序瘫痪。我正在使用EhCache 2.9您是否进行了内存转储?Ehcache是GC活动的责任还是来自应用程序的压力?是的,我通过VisualVM进行了堆转储。大多数对象是byte[]和char[],我在我的应用程序中不使用这些对象。我猜这些是我的对象的序列化版本。