Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google Guava缓存当前使用的字节数?_Java_Clojure_Guava - Fatal编程技术网

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

Java Google Guava缓存当前使用的字节数?,java,clojure,guava,Java,Clojure,Guava,我想知道缓存中使用了多少字节。这有助于确定合理的尺寸。有什么好方法可以统计Google Guava缓存中使用的字节数 stats方法没有给出我想要的;它不包括缓存中字节数的指标 asMap方法是迄今为止我找到的最好的方法。获得此信息后,可以使用中所示的一些技术。但是,坦率地说,至少从Clojure的代码库来看,这些似乎相当痛苦。为了避免某些依赖关系,我目前正在使用一个粗略的快捷方式,即Clojure序列化库:(count(nippy/freeze(.asMap cache))。我在寻找更好的方法

我想知道缓存中使用了多少字节。这有助于确定合理的尺寸。有什么好方法可以统计Google Guava缓存中使用的字节数

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

asMap
方法是迄今为止我找到的最好的方法。获得此信息后,可以使用中所示的一些技术。但是,坦率地说,至少从Clojure的代码库来看,这些似乎相当痛苦。为了避免某些依赖关系,我目前正在使用一个粗略的快捷方式,即Clojure序列化库:
(count(nippy/freeze(.asMap cache))
。我在寻找更好的方法

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

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

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
或其他集合进行比较)。番石榴链接到这个有用的资源,你可以参考,但显然这不包括缓存的内容,只是它的结构


不用说,正如路易斯·沃瑟曼(Louis Wasserman)评论的那样,你应该寻找一个不同的指标,更直接地告诉你需要知道什么。例如,您可能更感兴趣的是,它告诉您如何有效地使用缓存保留的任何数据。

这个问题如何使它与链接问题不完全相同?你想找到一个对象的大小,这让你很难过,因为这不容易,你正在考虑序列化它并计算字节:这正是另一个问题的要点。@amalloy在上面更新了。这个问题不是完全重复的——尽管可能有共同点——因为我是在番石榴的背景下问的。不明显(至少对我来说)链接问题中所示的方法对这个用例来说是最好的。您链接到的答案是“相当痛苦的”,因为没有一种非痛苦的方法来衡量Java对象(包括Guava缓存)字节的内存使用量。这并不是最好的在线记录,因为你通常最好是尝试寻找其他东西来衡量。