Google Guava缓存当前使用的字节数是多少?

9
我想知道缓存中使用了多少字节,这对确定合理的大小很有用。有哪些好方法可以统计 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 交互都相对容易。 < p > 更新:回应下面的评论,我想首先知道是否忽略了Google Guava缓存API的有用部分。其次,我不知道我链接的通用方法(用于计算堆上内存使用量)是否适用于Guava。更广泛地说,找到缓存大小利用率是一个重要的用例,所以我有点惊讶它在网上没有更好的文档记录。


2
这个问题有什么不同于链接问题的地方呢?你想要找到一个对象的大小,但很遗憾这并不容易,因此你正在考虑将其序列化并计算字节数:这些正是另一个问题的主要关键点。 - amalloy
1
@amalloy 已更新。这个问题并不是一个完全相同的重复 -- 尽管可能存在共性 -- 因为我是在 Guava 的上下文中提出的。对于这种用例,链接问题中展示的方法并不明显(至少对我来说不是)。 - David J.
6
您链接的答案“相当痛苦”,因为在Java对象(包括Guava Caches)中测量内存使用的字节数确实没有无痛苦的方法。它没有更好地在线记录,因为通常最好尝试找到其他要测量的东西。 - Louis Wasserman
1个回答

4
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所评论的那样,你应该寻找一种更直接地告诉你所需知道内容的不同度量标准。例如,你可能更感兴趣的是命中率,它告诉你你正在多么有效地使用缓存保留的任何数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接