JavaRush /Java блог /Random /Кофе-брейк #199. Лучший инструмент визуализации Java Stre...

Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java

Статья из группы Random

Лучший инструмент визуализации Java Stream для junior-разработчиков

Источник: Medium Вашему вниманию представлен краткий обзор функции IntelliJ Trace Current Stream Chain. Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 1Функция IntelliJ Trace Current Stream Chain позволяет нам визуализировать поток обрабатываемых значений. Хотя для опытных разработчиков, работающих с большими коллекциями сложных объектов, она может показаться бесполезной, эта функция может очень пригодиться начинающим разработчикам, изучающим Java Streams и функциональные конвейеры.

Поток примитивов

Начнем с небольшого потока целых чисел и простого функционального конвейера:

List<Integer> filteredValues = IntStream.range(0, 10).boxed()
    .filter(i -> i < 7)
    .map(i -> i * 3)
    .filter(i -> i % 2 == 0)
    .toList();
Чтобы использовать Trace Current Stream Chain, нам нужно запустить приложение в режиме отладки и поставить точку остановки в строке, где начинается конвейер: Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 2После того, как мы вошли в режим отладки, нужно нажать на кнопку “Trace Current Stream Chain”: Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 3Вуаля! Теперь у нас должно появиться диалоговое окно с конвейером. На этой диаграмме мы можем следить за потоком на каждом этапе. Например, мы можем видеть, что первый фильтр пропускает только первые 7 элементов, после чего каждому элементу сопоставляется его тройное значение. После этого поток снова фильтруется и сохраняются только четные элементы: Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 4

Поток объектов

Теперь давайте все повторим, только на этот раз воспользуемся потоком объектов вместо примитивов и добавим новые этапы, например, skip и limit:

List<Student> students = List.of(
    new Student("john", 18),
    new Student("doe", 16),
    new Student("jane", 19),
    new Student("jonnah", 20),
    new Student("joanne", 17),
    new Student("joey", 17)
);

List<String> names = students.stream()
    .limit(4l)
    .skip(1l)
    .filter(s -> s.age() >= 18)
    .map(s -> s.name().toUpperCase())
    .toList();
Мы можем наблюдать и отлаживать каждый из этапов. Мы можем видеть атрибуты объектов и наблюдать, как элементы преобразуются в строки в верхнем регистре на предпоследнем этапе: Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 5

Заключение

В этой статье мы обсудили работу функции IntelliJ Trace Current Stream Chain. Она может быть очень полезна для отладки потоков с небольшим количеством элементов, особенно если речь идет о начинающих разработчиках, которые хотят понять, как работают Java Streams.

Профилирование памяти в Java

Источник: Medium Вы когда-нибудь сталкивались с ошибкой OutOfMemoryError? Если да, тогда эта публикация для вас! Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 6Профилирование памяти — важнейший вопрос при оптимизации производительности Java-приложений. Сегодня вы узнаете о различных инструментах и ​​методах профилирования памяти в Java 8 или Java 11, а также о пошаговых инструкциях и примерах профилирования памяти в Java-приложениях.

VisualVM

Одним из популярных инструментов для профилирования памяти в Java является VisualVM. Этот бесплатный инструмент с открытым исходным кодом предоставляет подробную информацию об использовании памяти приложениями Java, включая дампы кучи, отслеживание распределения памяти и обнаружение утечек памяти. Чтобы выполнить профилирование памяти с помощью VisualVM, просто загрузите и установите инструмент, затем запустите его и подключите к своему Java-приложению. Оттуда вы можете использовать различные вкладки и диаграммы VisualVM, чтобы подробно изучить использование памяти вашим приложением, включая размер кучи, количество объектов в куче, а также количество создаваемых и уничтожаемых объектов. На сайте Oracle есть подробные инструкции по использованию VisualVM. Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 7

JConsole

Еще одним инструментом для профилирования памяти в Java является JConsole, входящий в комплект Java Development Kit (JDK). JConsole имеет графический интерфейс для мониторинга использования памяти и статистики сборки мусора, а также для выполнения дампов кучи. Чтобы выполнить профилирование памяти с помощью JConsole, просто запустите инструмент, подключите его к приложению Java и используйте его различные вкладки и диаграммы для просмотра информации об использовании памяти, включая размер кучи, количество объектов в куче и количество создаваемых и уничтожаемых объектов. В JConsole вы можете воспользоваться HotSpotDiagnostic (в разделе com.sun.management на вкладке MBeans), открыв его и подключившись к уже запущенному процессу Java. Описанный ранее метод dumpHeap присутствует в операциях. Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 8

JFR

Java Flight Recorder (JFR) — еще один вариант профилирования памяти в Java. Этот коммерческий инструмент является частью Oracle JDK и предоставляет подробную информацию о производительности и поведении приложений Java, включая использование памяти. Чтобы выполнить профилирование памяти с помощью JFR, просто запустите инструмент и настройте его для записи информации о вашем Java-приложении. Затем используйте различные вкладки и диаграммы JFR для просмотра информации об использовании памяти, включая размер кучи, количество объектов в куче и количество создаваемых и уничтожаемых объектов.

Инструменты командной строки

Для выполнения профилирования памяти в Java можно использовать также инструменты командной строки, такие как jmap и jcmd. Например, чтобы получить дамп кучи с помощью jmap, вы должны использовать следующую команду:

jmap -dump:format=b,file=heap.bin <pid>
На месте <pid> находится идентификатор процесса приложения Java, которое вы хотите профилировать. После этого вы можете использовать инструмент Eclipse Memory Analyzer (MAT). Он поможет в анализе дампа кучи и поиске объектов, которые не подвергаются сборке мусора, и объектов, которые используют больше памяти, чем должны. Например, чтобы найти объекты, которые используют много памяти в дампе кучи, нужно использовать функцию MAT “Dominator Tree” — она показывает объекты, которые хранят больше всего памяти в куче. Кофе-брейк #199. Лучший инструмент визуализации Java Stream для junior-разработчиков. Профилирование памяти в Java - 9Эти инструменты полезны для профилирования памяти, особенно в ситуациях, когда графический интерфейс не нужен или когда профилируемое приложение выполняется на удаленном сервере. К примеру, вы можете указать JVM автоматически создавать дамп кучи в случае нехватки памяти, то есть, при возникновении ошибки OutOfMemoryError. Для этого просто запустите приложение Java с параметром -XX:+HeapDumpOnOutOfMemoryError. Последний подход, который мы рассмотрим в этой статье, — это использование JMX. Мы будем использовать HotSpotDiagnostic MBean, кратко представленный в предыдущем разделе. MBean имеет метод dumpHeap, который принимает два параметра:
  • outputFile — путь к файлу дампа. Но этот файл должен иметь расширение hprof.
  • live — если установлено значение true, он выгружает только активные объекты в памяти, как мы видели ранее с jmap.

Заключение

Профилирование памяти является важнейшим компонентом повышения производительности Java-приложений. И как вы видите, для выполнения этого действия вам доступны несколько инструментов и методов. С их помощью вы можете получить более глубокое представление о том, сколько памяти использует ваше приложение, обнаружить утечки памяти и узкие места в производительности, а также предпринять необходимые действия для повышения производительности вашего приложения.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ