Тест памяти Java [закрыт]

В настоящее время я разрабатываю собственный проект на Java, который состоит из пользовательских структур данных. Для измерения производительности я выбрал фреймворк Google Caliper, но для измерения использования памяти структурой данных я должен каждый раз измерять его с помощью VisuamVm (сбрасывать кучу и ждать вычисления сохраненного размера объекта), чтобы получить достоверные результаты. Я хочу сделать какие-то тесты «теста памяти».

Итак, вопрос:

Существует ли какой-либо фреймворк Java, аналогичный Caliper или JunitBenchmarks, который позволяет проводить тесты для измерения потребления памяти моими структурами данных?


person Ivan Kurchenko    schedule 10.03.2014    source источник


Ответы (3)


Этот инструмент подходит для вас. Открыть JDK — макет объекта Java

Пример проверки HashMap

$ java -jar jol-cli/target/jol-internals.jar java.util.HashMap
  Running 64-bit HotSpot VM.
  Using compressed references with 3-bit shift.
  Objects are 8 bytes aligned.
  Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
  Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

  java.util.HashMap object internals:
   OFFSET  SIZE       TYPE DESCRIPTION                    VALUE
    0     4            (object header)                01 00 00 00 (00000001 00000000    00000000 00000000)
    4     4            (object header)                00 00 00 00 (00000000 00000000 00000000 00000000)
    8     4            (object header)                0f 0f 3e e0 (00001111 00001111 00111110 11100000)
   12     4        Set AbstractMap.keySet             null
   16     4 Collection AbstractMap.values             null
   20     4        int HashMap.size                   0
   24     4        int HashMap.threshold              16
   28     4      float HashMap.loadFactor             0.75
   32     4        int HashMap.modCount               0
   36     4        int HashMap.hashSeed               0
   40     4    Entry[] HashMap.table                  []
   44     4        Set HashMap.entrySet               null
   Instance size: 48 bytes (estimated, add this JAR via -javaagent: to get accurate result)
   Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
person cat_minhv0    schedule 10.03.2014

Хотя я не знаю библиотеки для этого, есть лучшие подходы, чем создание дампа кучи для измерения использования памяти: вы можете попросить JVM выполнить сборку мусора с помощью System.gc(), а затем запросить использование кучи с помощью Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory().

person meriton    schedule 10.03.2014
comment
Спасибо, но, насколько я знаю, это не лучший способ измерить точный размер объекта. - person Ivan Kurchenko; 10.03.2014
comment
Почему нет? И вы хотите измерить размер объекта или найти вклад в использование памяти кучи всего графа объекта? Это не то же самое... - person meriton; 10.03.2014
comment
Мне нужен сохраненный размер моего объекта. Когда я анализировал кучу с помощью VisuamVm, я обнаружил много объектов, которые были созданы не из моей тестовой программы (я запускаю ее из IntelliJ), и, как я понял, есть возможность получить неверные результаты с помощью Runtime.getRuntime().totalMemory() - Время выполнения.getRuntime().freeMemory(). - person Ivan Kurchenko; 10.03.2014

Тест памяти содержит две точки: пропускная способность и фрагментация. Здесь я думаю, что вы хотите сделать, это выбрать лучшую структуру данных для этой среды. Для этой точки, я думаю, вам также нужны эти две точки для измерения.

Здесь вы можете использовать OQL (язык объектных запросов) для запроса использования этой структуры данных. Вы можете использовать hprof и MAT для анализа контекста кучи вашей системы.

Чтобы решить ваш вопрос о проведении тестов для измерения потребления памяти, я предлагаю следующие шаги:

  1. Создайте продуктивную среду
  2. Запустить программу
  3. Важным моментом является то, что вы можете создавать дамп кучи с помощью JMX, чтобы сделать дамп кучи HPROF прямо до и после полного GC< /а>
  4. Используйте MAT, VisualVM для анализа hprof
person QJGui    schedule 10.03.2014
comment
Спасибо! Не могли бы вы порекомендовать несколько статей о пропускной способности и фрагментации в контексте памяти в Java? Я никогда раньше не слышал об этих терминах. - person Ivan Kurchenko; 10.03.2014