Лучший инструмент визуализации Java Stream для junior-разработчиков
Источник:
Medium
Вашему вниманию представлен краткий обзор функции IntelliJ Trace Current Stream Chain.
Функция 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, нам нужно запустить приложение в режиме отладки и поставить точку остановки в строке, где начинается конвейер:
После того, как мы вошли в режим отладки, нужно нажать на кнопку “Trace Current Stream Chain”:
Вуаля! Теперь у нас должно появиться диалоговое окно с конвейером. На этой диаграмме мы можем следить за потоком на каждом этапе. Например, мы можем видеть, что первый фильтр пропускает только первые 7 элементов, после чего каждому элементу сопоставляется его тройное значение. После этого поток снова фильтруется и сохраняются только четные элементы:
Поток объектов
Теперь давайте все повторим, только на этот раз воспользуемся потоком объектов вместо примитивов и добавим новые этапы, например,
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();
Мы можем наблюдать и отлаживать каждый из этапов. Мы можем видеть атрибуты объектов и наблюдать, как элементы преобразуются в строки в верхнем регистре на предпоследнем этапе:
Заключение
В этой статье мы обсудили работу функции IntelliJ Trace Current Stream Chain. Она может быть очень полезна для отладки потоков с небольшим количеством элементов, особенно если речь идет о начинающих разработчиках, которые хотят понять, как работают Java Streams.
Профилирование памяти в Java
Источник:
Medium
Вы когда-нибудь сталкивались с ошибкой OutOfMemoryError? Если да, тогда эта публикация для вас!
Профилирование памяти — важнейший вопрос при оптимизации производительности Java-приложений. Сегодня вы узнаете о различных инструментах и методах профилирования памяти в Java 8 или Java 11, а также о пошаговых инструкциях и примерах профилирования памяти в Java-приложениях.
VisualVM
Одним из популярных инструментов для профилирования памяти в Java является VisualVM. Этот бесплатный инструмент с открытым исходным кодом предоставляет подробную информацию об использовании памяти приложениями Java, включая дампы кучи, отслеживание распределения памяти и обнаружение утечек памяти. Чтобы выполнить профилирование памяти с помощью VisualVM, просто загрузите и установите инструмент, затем запустите его и подключите к своему Java-приложению. Оттуда вы можете использовать различные вкладки и диаграммы VisualVM, чтобы подробно изучить использование памяти вашим приложением, включая размер кучи, количество объектов в куче, а также количество создаваемых и уничтожаемых объектов. На сайте Oracle есть
подробные инструкции по использованию VisualVM.
JConsole
Еще одним инструментом для профилирования памяти в Java является JConsole, входящий в комплект Java Development Kit (JDK). JConsole имеет графический интерфейс для мониторинга использования памяти и статистики сборки мусора, а также для выполнения дампов кучи. Чтобы выполнить профилирование памяти с помощью JConsole, просто запустите инструмент, подключите его к приложению Java и используйте его различные вкладки и диаграммы для просмотра информации об использовании памяти, включая размер кучи, количество объектов в куче и количество создаваемых и уничтожаемых объектов.
В JConsole вы можете воспользоваться
HotSpotDiagnostic (в разделе com.sun.management на вкладке MBeans), открыв его и подключившись к уже запущенному процессу Java. Описанный ранее метод dumpHeap присутствует в операциях.
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” — она показывает объекты, которые хранят больше всего памяти в куче.
Эти инструменты полезны для профилирования памяти, особенно в ситуациях, когда графический интерфейс не нужен или когда профилируемое приложение выполняется на удаленном сервере.
К примеру, вы можете указать JVM автоматически создавать дамп кучи в случае нехватки памяти, то есть, при возникновении ошибки
OutOfMemoryError. Для этого просто запустите приложение Java с параметром
-XX:+HeapDumpOnOutOfMemoryError.
Последний подход, который мы рассмотрим в этой статье, — это использование JMX. Мы будем использовать HotSpotDiagnostic MBean, кратко представленный в предыдущем разделе. MBean имеет метод dumpHeap, который принимает два параметра:
- outputFile — путь к файлу дампа. Но этот файл должен иметь расширение hprof.
- live — если установлено значение true, он выгружает только активные объекты в памяти, как мы видели ранее с jmap.
Заключение
Профилирование памяти является важнейшим компонентом повышения производительности Java-приложений. И как вы видите, для выполнения этого действия вам доступны несколько инструментов и методов. С их помощью вы можете получить более глубокое представление о том, сколько памяти использует ваше приложение, обнаружить утечки памяти и узкие места в производительности, а также предпринять необходимые действия для повышения производительности вашего приложения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ