缓存如何限制使用的内存大小?

时间:2015-03-16 19:48:30

标签: java caching

当缓存允许您指定内存中缓存的最大大小(以兆字节为单位)。它如何强制使用不超过那么多兆字节?

例如在Java cache中,put()方法可能如下所示:

put(Object key, Object value)

是否有一种简单的方法可以通过引用获取值对象的对象大小?我能想到的唯一方法是使用反射递归遍历整个对象结构。但这应该很慢。

是否有一些不同的方法来跟踪此类缓存中的内存影响?

1 个答案:

答案 0 :(得分:1)

许多缓存中的一般方法是限制对象的数量。这忽略了不同对象可能分配不同内存量的事实。但是,平均来说,它基本上没问题。

在google guava中,您可以为任何对象分配抽象权重,用于驱逐决策。请参阅:https://code.google.com/p/guava-libraries/wiki/CachesExplained#Size-based_Eviction

EHCache实现了一个自动资源控制,它关注对象大小。这背后的引擎是github上的一个单独的项目:https://github.com/ehcache/sizeof,另请参阅Alex Saps的博客文章:http://codespot.net/2012/01/04/measuring-java-object-sizes/

它也是使用JVM工具的通用库:https://github.com/jbellis/jamm。如果我没记错的话,EHCache sizeOf确实实现了不同的方法,如果你的JVM上没有仪器,你就会丢失。