有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

字节缓存

我需要在java中实现一个最大大小的缓存,我想使用内存中缓存的实际大小,而不是缓存中元素的数量。这个缓存基本上将字符串作为键,字符串作为值。我已经使用java的LinkedHashMap结构实现了缓存,但问题是如何知道缓存的实际大小,以便我可以调整策略,在大小过大时删除对象

希望使用instrumentation包的getObjectSize()计算它,但它似乎没有按预期工作

当我执行getObjectSize(字符串)时,无论字符串的大小如何,它都返回相同的大小:32。我猜它只是使用字符串的参考大小或类似的东西,而不是内容。所以我不知道如何有效地解决这个问题

你有什么想法吗

非常感谢


共 (2) 个答案

  1. # 1 楼答案

    如果键和值都是字符串,那么计算就很简单:对象开销+字符串中每个字符2字节。在32位Sun JVM上,32字节的开销听起来是正确的

    有两个警告:首先,用于保存缓存的映射会增加其自身的开销。这将取决于哈希表的大小和映射中的条目数。就我个人而言,我会忽略所有的开销,根据字符串长度进行计算

    其次,除非按标识跟踪字符串,否则可能会计数过多,因为同一字符串可能存储在多个键中。因为按标识跟踪字符串会增加更多开销,所以这可能不值得做

    最后:虽然内存有限的缓存似乎是个好主意,但它们很少是。如果您对应用程序足够了解,那么您应该知道平均字符串长度,并且可以根据条目数控制缓存。如果您对应用程序不太了解,一个简单的LRU过期策略可能会让您陷入麻烦:一个大条目可能会导致许多小条目过期。如果发生这种情况,除非重建成本与大小成正比,否则您只是降低了缓存的效率