Когда вам нужно выяснить, какая часть приложения потребляет больше ресурсов процессора или памяти, вам нужно использовать профилировщик. Одним из профилировщиков, упакованных по умолчанию с Sun JDK, является Java VisualVM. Этот профилировщик действительно прост в использовании и действительно мощный.
В этом посте мы увидим, как его установить и использовать для профилирования приложения. Обычно для его установки вам нечего делать, потому что он уже установлен вместе с JDK. Но в некоторых системах Unix, таких как Ubuntu, это не так. Если вы хотите установить его, просто используйте apt-get (или aptitude):
sudo apt-get install visualvm
Чтобы запустить его, просто запустите jvisualvm (jvisualvm.exe в каталоге bin jdk для Windows). Это откроет следующее окно:
Здесь не так много интересного. Чтобы профилировать приложение, вам просто нужно запустить его, и VisualVM обнаружит его как запущенный:
После этого вам просто нужно дважды щелкнуть мышью, чтобы просмотреть информацию о запущенном приложении. Для ваших приложений доступно четыре вкладки (Обзор, Монитор, Потоки, Профилировщик). Мы увидим все четыре вкладки, прежде всего, вкладку по умолчанию, обзор:
Эта вкладка содержит основную информацию о запущенном приложении. Вы можете увидеть основной класс, аргументы командной строки, аргументы JVM. Вы также можете увидеть, какой тип JVM выполняет вашу программу и где находится JVM. И вы можете увидеть все свойства, установленные в программе.
Более интересная вкладка — вкладка «Монитор»:
Эта вкладка отражает использование процессора и памяти вашими приложениями. У вас есть 4 графика в этом представлении. Первый, слева направо, сверху вниз, отображает загрузку ЦП и загрузку ЦП сборщика мусора. На втором графике показано использование пространства кучи и пространства PermGen. На следующем графике показано общее количество классов, загруженных в приложение, а на последнем — количество запущенных потоков. С помощью этих графиков вы можете увидеть, занимает ли ваше приложение слишком много ЦПУ или слишком много памяти используется приложением.
Третья вкладка содержит некоторые подробности о потоках:
В этом представлении вы можете видеть, как различные потоки приложения изменяют состояние и как они развиваются. Вы также можете видеть время прохождения каждого потока в каждом состоянии, и вы можете иметь всю информацию о потоках, которые вы хотите.
И теперь, я думаю, самая интересная вкладка, это Profiler:
Когда вы сначала открываете эту вкладку, она вообще не содержит никакой информации. Вы должны начать один вид профилирования, прежде чем увидеть какую-либо информацию. Начнем с профилирования процессора. Просто нажмите на кнопку процессора, и приборные панели начнут работать. Во время инструментария приложение будет заблокировано. После инструментирования вы снова можете получить доступ к приложению, и вы увидите результаты профилирования, отображенные в таблице. Конечно, профилирование накладывает накладные расходы на ваше приложение. Обычно это не видно, но для некоторых приложений вы можете потерять много текучести. Вот результаты, которые я получил с помощью моего простого приложения:
В моем примере мы видим, что метод waitForTimeout занимает 81,6% процессорного времени. Мы также видим, что методы notifyDecision и getSensor являются следующими двумя наиболее ресурсоемкими методами, поэтому, возможно, будет интересно их оптимизировать. Вы также можете посмотреть количество вызовов каждого из них, возможно, вы найдете метод, который вызывается слишком часто.
Следующее профилирование, которое мы можем сделать, это профилирование памяти. Здесь снова, вы должны начать профилирование, и инструментация запустится, и во время этого приложение будет заморожено. Вот результаты для моего приложения:
Здесь мы видим, что это приложение хранит некоторые большие массивы double [] и float [] и что классы EllipseIterator и BasicStroke также занимают много места в памяти.
И в профилировании памяти, и в процессоре вы можете сохранить результаты в файл, чтобы просмотреть их позже. Например, вы можете позволить приложению работать всю ночь, сохранять результаты утром и проверять их. Или вы можете создать три сеанса профилирования и сравнить их.
В заключение я должен сказать, что этот профилировщик действительно прост, но и действительно мощный в использовании. У нас есть основные функции, которые мы хотим для профилировщика, и результаты действительно хороши. Такие инструменты действительно могут помочь вам улучшить приложение, чтобы использовать меньше ресурсов процессора и памяти. Конечно, этот вид инструмента не делает все, он просто помогает выделить, какие части приложения могут быть улучшены. Улучшение — это задача разработчика, и она не самая простая. Но такие инструменты — хорошее начало.
С http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm