【问题标题】:Bytes currently in use by a Google Guava cache?Google Guava 缓存当前使用的字节数?
【发布时间】:2014-09-05 18:35:23
【问题描述】:

我想知道缓存中使用了多少字节。这对于确定合理的大小很有用。统计 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。更广泛地说,查找缓存大小利用率是一个重要的用例,所以我有点惊讶它没有更好地在线记录。

【问题讨论】:

  • 这个问题如何使它不是链接问题的完全重复?您想找到一个对象的大小,这让您感到难过,这并不容易,您正在考虑对其进行序列化并计算字节数:这些正是另一个问题的要点。
  • @amalloy 上面已更新。这个问题不是 exact 重复的——尽管可能有共同点——因为我是在 Guava 的上下文中问的。不明显(至少对我而言)链接问题中显示的方法最适合此用例。
  • 您链接到的答案是“相当痛苦”,因为 没有非痛苦的方法来衡量 Java 对象(包括 Guava 缓存)的内存使用量(以字节为单位)。在线记录并没有更好的记录,因为您通常最好尝试找到其他要衡量的东西。

标签: java clojure guava


【解决方案1】:

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 的实例“使用”了后备数组的字节似乎是错误的。

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

毋庸置疑,正如 Louis Wasserman 所说,您应该寻找更直接地告诉您需要了解的内容的不同指标。例如,您可能对hit rate 更感兴趣,它告诉您有效您正在使用缓存保留的任何数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多