Статьи

Профилируйте свои приложения с Java VisualVM

Когда вам нужно выяснить, какая часть приложения потребляет больше ресурсов процессора или памяти, вам нужно использовать профилировщик. Одним из профилировщиков, упакованных по умолчанию с Sun JDK, является Java VisualVM. Этот профилировщик действительно прост в использовании и действительно мощный.

VisualVM стартовый логотип
VisualVM стартовый логотип

В этом посте мы увидим, как его установить и использовать для профилирования приложения. Обычно для его установки вам нечего делать, потому что он уже установлен вместе с JDK. Но в некоторых системах Unix, таких как Ubuntu, это не так. Если вы хотите установить его, просто используйте apt-get (или aptitude):

sudo apt-get install visualvm

Чтобы запустить его, просто запустите jvisualvm (jvisualvm.exe в каталоге bin jdk для Windows). Это откроет следующее окно:

VisualVM Main Frame
VisualVM Main Frame

Здесь не так много интересного. Чтобы профилировать приложение, вам просто нужно запустить его, и VisualVM обнаружит его как запущенный:

VisualVm приложение
VisualVm приложение

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

Вкладка Обзор VisualVM
Вкладка Обзор VisualVM

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

Более интересная вкладка — вкладка «Монитор»:

Вкладка VisualVM Monitor
Вкладка VisualVM Monitor

Эта вкладка отражает использование процессора и памяти вашими приложениями. У вас есть 4 графика в этом представлении. Первый, слева направо, сверху вниз, отображает загрузку ЦП и загрузку ЦП сборщика мусора. На втором графике показано использование пространства кучи и пространства PermGen. На следующем графике показано общее количество классов, загруженных в приложение, а на последнем — количество запущенных потоков. С помощью этих графиков вы можете увидеть, занимает ли ваше приложение слишком много ЦПУ или слишком много памяти используется приложением.

Третья вкладка содержит некоторые подробности о потоках:

Вкладка Темы VisualVM
Вкладка Темы VisualVM

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

И теперь, я думаю, самая интересная вкладка, это Profiler:

Вкладка VisualVM Profiler
Вкладка VisualVM Profiler

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

VisualVM профилирование процессора
VisualVM профилирование процессора

В моем примере мы видим, что метод waitForTimeout занимает 81,6% процессорного времени. Мы также видим, что методы notifyDecision и getSensor являются следующими двумя наиболее ресурсоемкими методами, поэтому, возможно, будет интересно их оптимизировать. Вы также можете посмотреть количество вызовов каждого из них, возможно, вы найдете метод, который вызывается слишком часто.

Следующее профилирование, которое мы можем сделать, это профилирование памяти. Здесь снова, вы должны начать профилирование, и инструментация запустится, и во время этого приложение будет заморожено. Вот результаты для моего приложения:

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

Здесь мы видим, что это приложение хранит некоторые большие массивы double [] и float [] и что классы EllipseIterator и BasicStroke также занимают много места в памяти.

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

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

С http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm