2014-09-05 2 views
4

Я хотел бы узнать, сколько байтов используется в кеше. Это полезно при определении разумного размера. Каковы хорошие способы подсчета количества байтов, используемых в кеше Google 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))). Я ищу лучшие способы.

Я использую кэширование Google Guava из кодовой базы Clojure, но мой вопрос не обязательно специфичен для Clojure; В большинстве случаев взаимодействие с Java довольно легко.

Обновление: Некоторый контекст в ответ на комментарий ниже. Во-первых, я хотел бы знать, не упускаю из виду полезную часть API кэширования Google Guava. Во-вторых, я не знаю, применимы ли общие подходы, которые я связывал (для подсчета использования памяти в куче), хорошо для Гуавы. В более широком смысле поиск размера кеша является важным прецедентом, поэтому я немного удивлен, что он не лучше документирован в Интернете.

+2

Как насчет этого вопроса делает его не точным дубликатом связанного вопроса? Вы хотите найти размер объекта, и вам становится грустно, что это непросто, и вы планируете сериализовать его и подсчитывать байты: это в точности основные моменты другого вопроса. – amalloy

+1

@amalloy Обновлено выше.Этот вопрос не является * точным * дубликатом, хотя могут быть общности - так как я спросил в контексте Гуавы. Не очевидно (для меня, по крайней мере), что подходы, показанные в связанном вопросе, являются лучшими для этого варианта использования. –

+5

Ответ, на который вы ссылаетесь, является «довольно болезненным», потому что нет никакого мучительного способа измерения использования памяти в байтах объектов Java, включая Guava Caches. Это не лучше документировано онлайн, потому что вам обычно лучше искать какую-то другую вещь для измерения. –

ответ

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 поддерживает. Гуава ссылки на этот полезный ресурс data structure memory footprints вы можете ссылаться, но, очевидно, это не будет включать содержимое кеша, только его структуру.

Излишне говорить, что, как прокомментировал Луи Вассерман, вы должны искать другую метрику, которая более прямо говорит вам, что вам нужно знать. Например, вас может больше заинтересовать hit rate, в котором рассказывается, как эффективно вы используете все данные, хранящиеся в кеше.

Смежные вопросы