Oracle java mission control как пользоваться

Обновлено: 17.05.2024

Для успешной диагностики нам понадобятся два инструмента: Java Mission Control (jmc) и Eclipse Memory Analyzer. Вобщем-то можно обойтись только Memory Analyzer, но с JMC картина будет более полной.

  • JMC входит в состав JDK (начиная с 1.7)
  • Memory Analyzer может быть загружен отсюда: MAT

Java Mission Control - инструмент анализа производительности Java

Выявление утечки

Следующим шагом нужно выявить, что именно не доступно для очистки и в этом нам поможет Memory Analyzer. Прежде всего, нужно загрузить в программу heap dump работающего приложения с предполагаемой утечкой памяти. Это можно сделать с помощью «File → Acquire Heap Dump». После загрузки в диалоге «Getting Started Wizard» выбрать «Leak Suspects Report» после этого откроется краткий обзор возможных утечек памяти:

Leak suspects report

Если вернуться на вкладку «Overview» и выбрать «Dominator Tree», то можно увидеть более подробную картину:

Overview

Denominator tree

Дерево показывает структуру «тяжелого» объекта, а так же размер его полей (по типу). Можно видеть, что одно из полей объекта MasterTenant занимает более 45% памяти.

2. Использование регистратора полета

Хорошо, тогда давайте посмотрим код. Это будет простая демонстрация самых основ Java Flight Recorder, и я намеренно затрудняюсь, чтобы дать нам что-то для отладки.

static BlockingQueue< byte []> queue = new LinkedBlockingQueue<>();

Для демонстрации классического OOME мы могли бы просто добавить новые объекты в коллекцию. Я выбрал этот, потому что часто вижу этот конкретный образец в производстве. То есть существует два (или более) компонента, и некоторые из них создают новые объекты, а некоторые из них потребляют эти объекты. Проблема связана с тем, что емкость этого внутреннего буфера, через который взаимодействуют компоненты, потенциально неограниченна.

-Xlog:gc*=debug: file =gc.log:utctime,uptime,tid,level:filecount=10,filesize=128m \ -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof \ Use jcmd 5469 JFR.dump name=1 to copy recording data to file . Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at nl .wizenoze.storm.OOMEGenerator.main(OOMEGenerator.java:12)

Я использую эти настройки отладки в производстве. В этом смысле эти аргументы JVM также служат примечанием для меня, когда они мне понадобятся, я найду их здесь.

Что касается JFR, это выделенная часть (строки 5-11). По умолчанию ни максимальный размер записи, ни максимальный возраст или записанные данные не ограничены. Я экспериментировал с различными настройками, и применение maxage и maxsize оказалось полезным. В более ранних версиях JDK у JFR было больше настроек, но они упростили их в версии 11.

Я хотел бы обратить ваше внимание на опцию dumponexit . При нормальных обстоятельствах при нормальных условиях запись записывается на диск всякий раз, когда захват данных прекращается. Это естественно случается, когда JVM завершается. Однако, согласно моему опыту, когда завершение является ненормальным, например, когда пространство кучи заканчивается, запись может иметь нулевой размер байта. Хотя в документации о настройках JFR не очень ясно, в чем dumponexit отличие dumponexit , я заметил, что его применение dumponexit для сбора данных с проблемных JVM.

JFR поставляется с двумя фабричными профилями (по default и profile ), и они определяют, какие события должны быть сохранены в захваченных записях. Если параметры настройки не указаны, default профиль по default . В этом примере я использовал более обширное определение события профиля, а также включил отслеживание пути к корням GC. Это накладывает большие накладные расходы на работающую JVM, и я бы не советовал использовать их в производстве.

Использование Java Flight Recorder с OpenJDK 11

Java Flight Recorder (JFR) раньше был коммерческим дополнением к Oracle JDK. Поскольку он недавно был открыт с Java Mission Control, все, кто использует OpenJDK 11, теперь могут бесплатно устранять неполадки в своих приложениях Java с помощью этого превосходного инструмента. JFR, будучи ранее проприетарным решением, может быть менее известен тем, кто полагается на предыдущие версии OpenJDK. Поэтому я подумал, что стоит написать свежий пост об использовании JFR с OpenJDK 11.

Java Flight Recorder

2.1 Starting the Java Mission Control Client

The JMC client executable file is located in the bin directory of the Java SE Development Kit (JDK) installation path ( JAVA_HOME ). If the JAVA_HOME/bin directory is in the PATH environment variable, you can start the JMC client by entering jmc at the command-line prompt (shell). Otherwise, you have to specify the full path to the JMC executable:

JAVA_HOME/bin/jmc (Linux, OS X)

On Windows, a shortcut to the JMC client executable is added to the Java Development Kit folder under All Programs in the Start menu.

On OS X, if you cannot find the JMC executable or locate JMC in Spotlight, you can start JMC from the command line using /Library/Java/JavaVirtualMachines/jdk< version >.jdk/Contents/Home/bin/jmc . Alternatively, use Finder to browse to /Library/Java/JavaVirtualMachines/jdk< version >.jdk/Contents/Home/lib/missioncontrol and double-click the Java Mission Control app.

On OS X, when you launch the JMC executable, the Terminal window opens. When you close the JMC client, the Terminal is left behind with the text [Process completed] . To avoid this, open the Terminal Preferences , then open the Settings tab, select the scheme you use, then select the Shell tab, and change the When the shell exits option to Close if the shell exited cleanly .

Passing JVM Options To the JMC Launcher

JMC is a Java application, and the JMC client executable is a launcher for this application. JMC startup is controlled by options specified in the jmc.ini file, which is located in the JAVA_HOME/bin directory. Arguments to the -vmargs option in the jmc.ini file are options that are passed to the JVM running the JMC application. You can specify these options to control the way this JVM runs. If you do not want to modify the jmc.ini file, you can specify JVM options on the command line as arguments to the -vmargs option of the jmc command.

If other options are specified for the jmc command, the -vmargs option must be specified last.

To start the JMC client with your own set of JVM options (overriding those specified in the jmc.ini file), run the following command (separate multiple arguments with spaces):

jmc -vmarg arguments

To start the JMC client with additional JVM options (appending them to those specified in the jmc.ini file), run the following command (separate multiple arguments with spaces):

jmc --launcher.appendVmargs -vmarg arguments

Using a Workspace Directory

If you want to copy your settings for the JMC client to another computer or another user, or use different predefined settings for different applications, add the -data command-line option and define a workspace directory when you start the JMC client:

jmc -data workspace-directory

Анализ использования памяти

Прежде всего, нужно запустить приложение со следующими флагами JVM:
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder

Не используйте эти опции на production системе без приобретения специальной лицензии Oracle!

Эти опции позволят запустить Flight Recorder – утилита, которая поможет собрать информацию об использовании памяти (и много другой важной информации) во время выполнения программы. Я не буду описывать здесь как запустить Flight Recorder, эта информация легко гуглится. В моем случае было достаточно запустить FR на 10-11 минут.

Рассмотрим следующий рисунок, на котором показана классическая «пила» памяти, а так же важный сигнал, что что-то не так с использованием памяти:

Запись Fight recorder

Можно увидеть, что после каждого цикла очистки памяти, heap все больше заполняется, я выделил это желтым треугольником. «Пила» все время как бы ползет вверх. Это значит, что какие-то объекты не достижимы для очистки и накапливаются в old space, что со временем приведет к переполнению этой области памяти.

Включите JFR

Java Flight Recorder-JFR по умолчанию отключен. Добавив параметр -XX: + UnlockCommercialFeatures -XX: + FlightRecorder к команде для запуска приложения, вы можете включить JFR и некоторые связанные функции. Но стоит отметить, что эта команда только включает функцию JFR, но не включает различные события процесса записи. Это требует от нас включения функции записи запущенных потоков для генерации записей через пользовательский интерфейс или командную строку после включения функции JFR. .

Откройте JFR через JMC

Самый простой способ - запустить JFR через JMC.При запуске JMC все процессы JVM в текущей системе будут отображаться в интерфейсе. Процесс JVM отображается в древовидной структуре, разверните узел процесса JVM и откройте окно Flight Recorder с помощью кнопки Flight Recorder, как показано на рисунке 6.

Рисунок 6. Вид окна записи Java Flight Recorder

 6. Java Flight Recorder

Flight Recorder имеет два режима: режим фиксированной продолжительности (1 минута на рисунке) и непрерывный режим.В непрерывном режиме кольцевой буфер используется для сохранения самых последних событий.

При выполнении упреждающего анализа, например, когда вы начинаете записывать события во время нагрузочного тестирования, вам следует использовать режим фиксированной продолжительности, чтобы вы могли получить хорошее представление о производительности JVM во время тестирования.

Непрерывный режим подходит для реактивного (реактивного) анализа, так что JVM может сохранять самые последние события, а также экспортировать и записывать данные в ответ на эти события. Например, в службах приложений Weblogic можно настроить триггеры для экспорта соответствующих данных после того, как сервер приложений отреагирует на аномальное событие.

Откройте JFR через командную строку

Добавьте -XX: + FlightRecorderOption = в параметры запуска JVM, чтобы начать запись событий. Параметр представляет собой пару данных, разделенных запятыми. Эти параметры описаны ниже:

Укажите название записи

Следует ли начинать запись событий во время инициализации, по умолчанию - false, для анализа реакции следует установить значение true.

Путь к файлу конфигурации JFR

Задержка перед началом записи

Путь к файлу для сохранения записанных событий

Следует ли использовать gzip для сжатия данных записи, по умолчанию - false

Максимальное время для сохранения записанных данных в кольцевом буфере

Максимальное пространство, занимаемое кольцевым буфером

Чтобы использовать JFR более гибко, вы можете использовать команду jcmd для динамического изменения значения этих параметров во время работы. Далее будут представлены команды для использования jcmd для установки параметров, связанных с JFR.

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

Укажите имя записи события экспортируемых данных

Номер записи события JFR

Путь к файлу экспорта

В одном процессе может выполняться несколько записей событий JFR. Для просмотра всех текущих записей событий можно использовать следующую команду:

Эти различные записи событий различаются именами или случайными номерами записей. Используйте следующую команду, чтобы остановить запись событий, которая выполняется в процессе:

Имя останавливаемой записи события.

Номер записи события, которое необходимо остановить

Если это правда, отказаться от ранее сохраненных данных

Путь к файлу для сохранения данных

2 Using the Java Mission Control Client

This chapter describes how to start the JMC client and use its features.

The JMC client is the main application from which you connect to JVMs and start the tools included in Java Mission Control. You can run the JMC client either as a standalone application or as an Eclipse plug-in. Ensure that you run the JMC client in a secure environment, because it does not include or run with a security manager.

введение

Эта статья - третья из серии инструментов анализа производительности Java, в которой я расскажу, как использовать Java Mission Control для углубленного анализа производительности Java-приложений, и предоставлю помощь разработчикам программ при использовании Java Mission Control.Часть 1: Инструменты операционной системы,Часть 2: встроенные инструменты мониторинга Java。

JMC - это инструмент мониторинга производительности, добавленный в выпуске JAVA 7u40. Пользователи, которые использовали JRockit JVM в JDK 6, будут знакомы, потому что это часть функции JMC в Java 7. После запуска JMC будет отображаться информация о текущем процессе JVM на текущем компьютере.Конечно, мы также можем добавить дополнительные процессы JVM для мониторинга. На рисунке 1 показан экран использования JMC для мониторинга сервера приложений GlassFish. На рисунке показана основная информация о отслеживаемой программе, в том числе частота использования ЦП и скорость использования кучи памяти. Стоит отметить, что диаграмма мониторинга JMC показывает использование ЦП на текущей машине. Вы можете увидеть мониторинг JMC Это вся система, а не только загрузка ЦП выбранной JVM. Настраивая информацию, отображаемую на панели мониторинга выше, вы можете просматривать подробную информацию о отслеживаемой JVM, такую ​​как сборка мусора, загрузка классов, использование потоков и использование кучи памяти и т. Д. Вы также можете просмотреть конкретную информацию об операционной системе, такую ​​как использование ЦП и памяти системы, информацию об обмене дисками, среднюю нагрузку и другую связанную информацию.

Рисунок 1. Схема мониторинга Java Mission Control

 1. Java Mission Control

Выберите событие JFR

В настоящее время JFR поддерживает 77 типов событий. Большинство типов событий являются периодическими событиями и будут генерироваться через определенные промежутки времени. Другие типы событий являются типами триггеров, которые срабатывают только при достижении определенного установленного порога. Это означает, что он будет обнаружен и отслеживаться JFR.

Сбор данных о событиях, естественно, повлияет на производительность приложения, и размер воздействия зависит от типа и количества событий, которые включены для ведения журнала. По умолчанию запись всех типов событий не включена, а шесть типов событий, которые имеют большее влияние на производительность, отключены, чтобы уменьшить влияние JFR на приложение до менее 1%.

Но иногда стоит включить некоторые типы событий, которые имеют большее влияние на приложение. Например, TLAB - это тип события, который по умолчанию отключен, но он может помочь людям определить, входят ли определенные объекты напрямую в старое поколение при выделении памяти. Точно так же, хотя событие профилирования включено по умолчанию, оно запускается каждые 20 миллисекунд, что может легко вызвать ошибки при анализе выборки.

События, регистрируемые JFR, определяются в шаблоне, который можно указать с помощью параметра настроек. Для среды выполнения JFR есть два шаблона:

  1. Шаблон по умолчанию: влияние событий на производительность приложения не превышает 1%.
  2. Шаблон анализа: установите для большинства событий, основанных на пороге (Threshhold), запуск каждые 10 миллисекунд.Влияние шаблона анализа на производительность приложения составляет около 2%.

Эти шаблоны управляются менеджером шаблонов JMC, который запускается соответствующей кнопкой в ​​JMC. Есть два каталога для хранения шаблонов: каталог $ HOME / .JMC / <release> и каталог $ JAVA_HOME / jre / lib / jfr. В диспетчере шаблонов вы можете выбрать глобальный шаблон, локальный шаблон или определить новый шаблон. При определении нового шаблона вам необходимо указать доступные события, указать, что состояние этих событий по умолчанию - включено или выключено, и определить порог этих событий.

На рисунке 7 событие чтения файла включено, и порог установлен на 15 миллисекунд, то есть это событие будет инициировано, когда файл читается более 15 миллисекунд. В то же время это событие также настроено на создание записи стека для события чтения файла. Поскольку это увеличит влияние события на производительность приложения, этот параметр устанавливается как дополнительный элемент конфигурации.

Рисунок 7. Пример схемы шаблона события Java Flight Recorder

 7. Java Flight Recorder

Файл шаблона события - это файл xml, поэтому, прочитав файл xml, легко определить, включено ли событие. Вы также можете скопировать локальный файл шаблона в глобальный каталог шаблонов для использования другими пользователями и группами.

Java Flight Recorder (JFR) обеспечивает подробный анализ состояния JVM во время выполнения. Это связано с тем, что сам JFR является частью встроенной в него Java. Как и другие инструменты, использование JFR в некоторой степени увеличивает накладные расходы на производительность приложения. Регулярное использование JFR по-прежнему может помочь нам собрать много информации, а накладные расходы на производительность низкие.

2.2 Java Mission Control Client GUI

When you first launch the JMC client, the left part of the window contains two views by default:

JVM Browser is the plug-in that shows all available JVM connections.

Event Types contains a list of event types for a selected flight recording. For information about opening a flight recording, see the Java Flight Recorder plug-in section of the online help.

You can open the Window menu, select Show View and then Other to open a window that lists all available views. Select the necessary views and click OK to open them. The following views are available in addition to the default ones:

Properties lists the properties of items that you select in tables, including hidden properties that are not displayed in the tables.

Progress View displays the progress of running operations, for example, a flight recording.

Help displays the Java Mission Control online help.

The other part of the JMC client window is reserved for the Editor Area, which is used to work with the plug-ins for available JVM connections. To launch a plug-in, right-click a JVM connection and select the plug-in ( Start JMX Console , Open Historical Data , Start Flight Recording , etc.).

2.2.1 Tabs and Tab Groups

Views and editors are displayed as tabs united into tab groups. You can drag tabs and tab groups around the JMC client window to create a layout that works best for you. View tabs and tab groups can even be detached from the main window.

You can maximize a tab group to the size of the JMC client window or minimize it to make more room for other tab groups:

To maximize a tab group, click the Maximize button in the top-right corner. The tab group expands almost to the size of the JMC client window and the Maximize button changes to the Restore button. The other tab groups are automatically minimized.

To minimize a tab group, click the Minimize button in the top-right corner. The tab group shrinks and the Minimize button changes to the Restore button. The other tab groups fill the rest of the JMC client window proportionally.

To restore the tab to its original state, click the Restore button.

To separate logically related information, editor tabs are divided into subtabs (or subtab groups), allowing you to drill down into specific data. Some of the subtabs have buttons to control the data displayed in them to the right of the subtab name.

2.2.2 Panels

Editor tabs are composed of panels with logically related information in the form of graphs, tables, lists, and so on. You can modify some of the parameters using various controls in the panels, such as buttons, text fields, drop-down lists, and so on.

Some panels can be collapsed to make more room for other panels in the tab (using the black triangle show and hide button next to the panel name). To the right of the panel name, there are buttons to add and remove components, refresh data, switch modes, change settings, get online help about the panel, and so on.

Most panels are unique, but some are similar for different tabs. Information for using each panel is provided in the description for the panel. To see this information, click the question mark button to the right of the panel name.

Блог о программировании

В этой статье я расскажу о том, что такое Java Mission Control и чем он может помочь.

Начиная с 7u40 в составе Oracle JDK появился GUI инструмент для реалтайм мониторинга и профилирования JVM. Он позволяет собрать очень много информации о JVM процессе, найти узкие места и проблемы, которые влияют на производительность.


С точки зрения пользователя, вы запускаете ваше Java приложение, включаете запись событий, ждете фиксированное время пока события записываются и затем проводите анализ собранных данных.



Mission Control включает в себя JMX консоль и Java Flight Recorder (JFR). С помощью JMX осуществяется взаимодействие с удаленным Java процессом, а JFR собирает данные о событиях.

По умолчанию JMX и JFR выключены в Oracle JVM. Для их включения при запуске вашего Java приложения добавьте следущие параметры:

Пример запуска JAR файла с этими параметрами:


После запуска приложения попробуем подключиться к нему с помощью JMC.

Запускаем GUI (набрать в консоле jmc ), создаем новое подкючение к JVM, указываем настройки подключения к удаленному серверу:


Включаем запись событий, указываем сколько времени будем собирать данные, одной минуты вполне дотаточно:


JFR (Java Flight Recorder)

JFR - очень важная функция в JMC. Он записывает исторические данные обо всех событиях JVM. С помощью этих данных аналитики производительности программ могут анализировать и диагностировать узкие места производительности JVM в сочетании с прошлыми историческими данными.

Основная операция JFR - запуск серии событий (например, поток заблокирован в ожидании блокировки). Когда происходит событие, все данные этого события будут сохранены в памяти или в файле. Поток данных хранится в кольцевом буфере, поэтому доступны только данные из самого последнего события. JMC может считывать и отображать эти данные о событиях из JVM или файлов, с помощью которых можно выполнять анализ производительности.

Через параметры JVM пользовательский интерфейс JMC использует команду jcmd для указания типов событий, упомянутых выше, размера кольцевого кеша и места хранения данных. По умолчанию JMC практически не влияет на отслеживаемое приложение. Но по мере того, как включается все больше и больше событий и изменяется порог срабатывания событий, влияние JMC также меняется. Затем будет показан пользовательский интерфейс JFR.

Обзор JFR

В этом примере используется JFR для записи связанных данных в течение 6 минут от сервера приложений GlassFish. На рисунке 2 показан общий вид после загрузки этих данных JMC.

Рисунок 2. Примерная диаграмма загрузки данных JMC.

 2. JMC

Информация на этом изображении аналогична изображению, которое видит основной информационный мониторинг JMC. На панели мониторинга выше показано использование ЦП и кучи памяти. Над ней находится шкала времени, показывающая последовательность событий, а вертикальные полосы представляют события. Вы можете увеличить интересную часть временной шкалы для подробного анализа. Как показано на рисунке, выберите 1 минуту и ​​6 секунд в конце 6-минутной временной шкалы для увеличения.

Кривая использования ЦП на рис. 2 ясно показывает, что средний коэффициент использования JVM, на котором расположен сервер GlassFish, составляет около 70%, в то время как общая загрузка ЦП машины достигает 100%. Внизу есть несколько меток на выбор, метки системных атрибутов, метки информации JVM и т. Д. Кнопки в левой части экрана предоставляют более подробные сведения о состоянии работы приложения.

Просмотр памяти JFR

Информация, собираемая JFR memory view, очень обширна, и на рисунке ниже показана только ее часть. Из рисунка 3 видно, что объем памяти, занимаемой молодым поколением, периодически колеблется. Но интересно то, что, поскольку нет объектов, которые можно было бы перенести в старость, общий размер кучи памяти приложения не увеличился. На нижней левой панели отображаются все типы событий сборки мусора за период мониторинга, которым в этом примере всегда является ParallelScavenge. Когда событие выбрано, оно будет отображаться более подробно в правом нижнем углу, включая все этапы события и время, затраченное на каждый этап.

Рисунок 3. Пример графика использования памяти в новом поколении

 3.

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

Просмотр кода JFR

Представление кода JFR показывает основную аналитическую информацию, полученную из записанных данных. Как показано на рисунке 4. Первая вкладка отображает все имена пакетов. Мы не видели подобных функций в других инструментах анализа. Видно, что выполнение метода Java.Math на рисунке составляет 41% от общего времени выполнения всех вызовов методов приложения. Традиционная перспектива анализа находится внизу, такая как метод горячей точки и вызов анализируемого кода, как показано на рисунке ниже.

Рисунок 4. Представление кода Java Flight Recorder

 4. Java Flight Recorder

В отличие от других программ анализа, JFR предоставляет больше режимов визуализации кода. Вкладка Throwables отображает обработку исключений в приложении, а также вкладку, которая отображает информацию о работе компилятора.

JMC также предоставляет представление потоков, представление ввода-вывода, представление системы, все эти представления предназначены для лучшего анализа реальных событий, записанных JFR.

Обзор событий JFR

JFR записывает и сохраняет поток событий.JMC предоставляет различные представления для анализа этих событий, но панель событий JFR (показанная на рисунке 5) является наиболее эффективным способом анализа событий.

Рисунок 5. Просмотр событий Java Flight Recorder

 5. Java Flight Recorder

Отображаемые события можно отфильтровать с помощью фильтра на левой панели.На рисунке выбраны только события уровня приложения. Следует отметить, что здесь будет отображаться только тип события, указанный в событии сохранения записи JFR, и фильтрация может выполняться только на этом основании.

Из рисунка 5 видно, что в течение 66 секунд приложение генерирует 6 типов событий, включая 10612 событий JVM и 1536 событий библиотеки JDK. Причина, по которой события Park и Monitor занимают много времени, обсуждалась в предыдущей статье, поэтому я не буду их здесь повторять. Приложение имеет несколько потоков, которые занимают 40 секунд для записи данных в сокет (Socket Write), что является нормальным значением для приложения, использующего 4 ядра, но оно все же может уменьшить объем данных, записываемых в сокет. Объем данных для повышения производительности.

Точно так же несколько потоков в приложении потратили 143 секунды на чтение данных из сокета (Socket Read). Это не кажется нормальным.Просматривая записи обработки этих событий, можно обнаружить, что несколько потоков используют блокирующий ввод-вывод для чтения прерывистых запросов управления. Временной интервал между этими запросами управления обычно очень большой, но эти потоки блокируются в методе read (), что приводит к тому, что эти потоки занимают слишком много времени при чтении данных.

Для событий монитора,

Анализатор квази-производительности может предоставить информацию о вызове кода ЦП и операционной системы, ожидающего разблокировки после блокировки потока, в то время как собственный анализатор Java может предоставить записи о выполнении этого кода ЦП и операционной системы, точно так же, как JVM напрямую предоставляет эту информацию в JFR.

События JFR получаются непосредственно из JVM. Благодаря этим событиям можно подробно понять внутренние условия работы приложения, чего не могут достичь другие инструменты. Есть много типов событий, и есть различия между разными версиями JDK. Ниже перечислены некоторые распространенные типы событий: первая строка описывает информацию, которую можно получить с помощью других инструментов, а вторая строка описывает информацию, которую нельзя получить, кроме как с помощью JFR.

Количество загруженных классов и количество выгруженных классов

Загрузите загрузчик классов (загрузчик классов), время, необходимое для загрузки класса

Количество созданных потоков, количество уничтоженных потоков, моментальные снимки потоков (дамп)

Блокировка, которая блокирует указанный поток и поток, заблокированный указанной блокировкой

Класс исключения приложения

Количество исключений и ошибок, сгенерированных приложением, и созданная запись стека исключений и ошибок.

Количество выделенных куч памяти, размер TLAB (Thread-Local Allocation Buffers)

Выделение памяти для указанных объектов в паре памяти и запись стека памяти, выделенной для этих объектов.

Время, затраченное на ввод / вывод

Время, затрачиваемое на каждый вызов чтения и записи, а также файл или сокет, для которого операция чтения и записи занимает слишком много времени.

Поток ждет монитора

Монитор, который заблокировал поток, время блокировки потока

Размер и содержимое кеша кода

Метод удаления из кеша кода, настройка кеша кода

Какие методы компилируются, компиляция OSR, компиляция требует много времени

В JFR нет дополнительной информации, но JFR суммирует информацию из нескольких исходных файлов.

Количество GC, включая номер каждой стадии, размер каждого поколения

В JFR нет дополнительной информации, но JFR суммирует информацию из нескольких инструментов.

Анализ обнаружения и анализ проб

JFR не имеет большого объема информации, получаемой анализатором, но JFR обеспечивает обзор более высокого уровня.

подводить итоги

До сих пор в этой серии статей были представлены наиболее часто используемые инструменты анализа производительности Java. Все мы знаем, что отличный инструмент анализа производительности - это ключ к нашему анализу производительности, но он не может быть полностью или даже чрезмерно зависимым от этого инструмента. На первый взгляд, мы должны помнить, что не существует лучшего инструмента, а есть только подходящие инструменты. Как мы уже говорили, инструмент A может подходить для анализа большинства приложений, но он не может выявить проблемы, на которые может указать инструмент B, поэтому Мы должны научиться использовать эти инструменты гибко и свободно.

Инструмент командной строки также очень полезен для аналитиков производительности, поэтому не отрицайте возможности, которые он может дать. Он часто может играть огромную роль в автоматическом мониторинге производительности или тестировании производительности.

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

1. Обзор

1.1. О Java Flight Recorder

Диагностика неисправных приложений с помощью JFR может значительно сократить время разрешения. На первый взгляд может показаться, что аномалия разворачивается и, наконец, наступает до того момента, когда это приводит к смерти приложения. Конечно, не все проблемы настолько серьезны. JFR собирает данные о запущенных потоках, циклах GC, блокировках, сокетах, использовании памяти и многом другом.

1.2. Java Flight Recorder вышел с открытым исходным кодом

Как я уже упоминал во вступлении, эта функция была проприетарной функцией Oracle JDK, и официально она была доступна только для платных клиентов Oracle. На практике вы можете включить его с -XX:+UnlockCommercialFeatures -XX:+FlightRecorder флагов -XX:+UnlockCommercialFeatures -XX:+FlightRecorder и более ранних -XX:+UnlockCommercialFeatures -XX:+FlightRecorder JVM не будут -XX:+UnlockCommercialFeatures -XX:+FlightRecorder наличия лицензионного ключа или чего-либо подобного.

Марк Рейнхольд из Oracle хотел ускорить продвижение Java и получил вдохновение от некоторых операционных систем Linux, выпуск которых составлял шесть месяцев. Я думаю, что он мог подумать об Ubuntu, хотя он не упомянул это именно. Тем не менее, Java SE начиная с версии 9 действительно имеет предсказуемый шестимесячный цикл выпуска.

Короче говоря, чтобы сократить время выпуска, теперь они работают на единой кодовой базе, что сделало сборки Oracle JDK и OpenJDK взаимозаменяемыми. В конце концов, начиная с Java 11, Oracle предоставляет версии JDK под открытым исходным кодом GPL и коммерческой лицензией . Если вы привыкли получать двоичные файлы Oracle JDK бесплатно, вместо этого скачайте сборки OpenJDK , они функционально идентичны.

Как следствие, JFR стал открытым исходным кодом и упростил процесс выпуска благодаря единой движущейся базе кода, которая делает OpenJDK более привлекательной для разработчиков.

1.3. Различия в упаковке JFR

Oracle JDK 11 выдает предупреждение при использовании опции -XX:+UnlockCommercialFeatures , тогда как OpenJDK не распознает эту опцию и сообщает об ошибке.

1.4. Java Mission Control также был открытым исходным кодом

JMC также недавно был открыт с открытым исходным кодом, и это означает, что теперь весь набор инструментов (JFR + JMC) доступен любому, кто использует OpenJDK 11. На момент написания первой версии 7 JMC с открытым исходным кодом еще не достиг GA, но ранние сборки доступа обеспечены.

Java Flight Recorder

Русские Блоги

Устранение утечки

Имея результат анализа из предыдущего пункта, следующим шагом идет устранение накапливания объектом памяти. Тут все сильно зависит от конкретного кода. Общая рекоменация – нужно найти и проанализировать все места, где происходит инициализация или изменение соответствующего поля или полей, чтобы понять механизм накапливания памяти. В моем случае в коллекцию постоянно добавлялись записи из множества (около 150) потоков при определенных условиях.

После находжения и устранения утечки, не лишним будет пройти все шаги снова, проанализировать память и отчет Memory Analyzer, чтобы убедиться что фикс помог.

Читайте также: