目前Google Guava缓存使用的字节数?

时间:2014-09-05 18:35:24

标签: java clojure guava

我想知道缓存中正在使用的字节数。这在确定合理的尺寸方面很有用。有什么好方法可以计算Google Guava缓存中使用的字节数?

stats方法没有给出我想要的东西;它不包括缓存中字节数的指标。

asMap方法是迄今为止我发现的最佳方法。获得此信息后,可以使用In Java, what is the best way to determine the size of an object?中显示的一些技术。但是,坦率地说,这些看起来相当痛苦,至少从Clojure代码库来看。为了避免某些依赖,我目前正在使用Nippy的粗略快捷方式,即Clojure序列化库:(count (nippy/freeze (.asMap cache)))。我正在寻找更好的方法。

我正在使用Clojure代码库中的Google Guava缓存,但我的问题不一定是Clojure特有的;在大多数情况下,Java互操作相对容易。

更新:响应以下评论的某些背景信息。首先,我想知道我是否忽略了Google Guava缓存API的有用部分。其次,我不知道我链接的通用方法(用于计算堆上的内存使用情况)是否适用于Guava。更广泛地说,查找缓存大小利用率是一个重要的用例,所以我有点惊讶它没有更好的在线记录。

1 个答案:

答案 0 :(得分:0)

Java(以及扩展名为Guava)没有提供任何简单或有意义的方法来衡量对象或数据结构使用的“字节数”。值得注意的是,该概念甚至没有一个连贯的定义,因为一个对象可以从多个其他对象引用,并且没有字节的概念被特定数据结构“拥有”。像Rust这样的其他语言有这种所有权概念,但Java没有。

例如,MyClass的实例使用了多少字节?

public class MyClass {
  private static final int[] BIG_ARRAY = new int[1_000_000];
  private final int[] myArray = BIG_ARRAY;
}

显然,该类使用大量内存,但每个实例仅使用几个字节来引用静态分配的数组。您可以创建数千个MyClass个实例,并且看到很少的内存影响,即使所有实例都是GCed BIG_ARRAY也会留下来。所以说MyClass“的实例使用”支持数组的字节。

似乎是错误的

可以根据ConcurrentHashMap维护的字段和实例确定缓存本身使用的字节数(例如,将其与使用Cache或其他集合进行比较) 。 Guava链接到您可以参考的data structure memory footprints这个有用的资源,但显然这不包括缓存的内容,只包括其结构。

毋庸置疑,正如Louis Wasserman评论的那样,您应该寻找一种更直接告诉您需要知道的不同指标。例如,您可能对hit rate更感兴趣,它会告诉您如何有效您正在使用缓存保留的任何数据。