Лучший способ решить эту проблему без изменения вашего приложения - вообще не использовать VisualVM. Что касается других бесплатных опций, вы можете использовать либо Eclipse TPTP , либо Netbeans profiler , либо все, что поставляется с вашей IDE.
Если вы можете изменить свое приложение, чтобы приостановить его состояние при настройке профилировщика в VisualVM, это вполне возможно сделать с помощью плагина VisualVM Eclipse. Я не уверен, почему вы получаете исключение NullPointerException, так как оно работает на моей рабочей станции. Вам необходимо настроить плагин, указав путь к двоичному файлу jvisualvm
и путь к JDK; это можно сделать, посетив диалоговое окно настройки VisualVM в Windows -> «Настройки» -> «Выполнить / отладить» -> «Запуск» -> «Настройка VisualVM» (как показано на снимке экрана ниже).
Вам также необходимо настроить приложение для запуска с помощью средства запуска VisualVM вместо средства запуска JDT по умолчанию.
Все приложения, запускаемые из Eclipse, теперь приводят к тому, что VisualVM автоматически отслеживает новую локальную JVM при условии, что VisualVM уже запущен. Если у вас не работает VisualVM, то плагин запустит VisualVM, но он также продолжит запуск приложения.
Исходя из предыдущего предложения, очевидно, что остановка приложения в методе main()
перед выполнением какой-либо обработки весьма полезна. Но это не главная причина приостановки приложения. По всей видимости, VisualVM или его плагин Eclipse не позволяют автоматически запускать профилировщики процессора или памяти. Это будет означать, что эти профилировщики нужно будет запускать вручную, что потребует приостановки приложения.
Кроме того, стоит отметить, что добавление флагов: -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
к запуску JVM не поможет вам в случае VisualVM приостановить работу приложения и настроить профилировщики. Флаги предназначены для того, чтобы помочь вам в случае профилировщиков, которые действительно могут подключаться к открытому порту JVM, используя протокол JDWP. VisualVM не использует этот протокол, и поэтому вам придется подключаться к приложению с помощью JDB или удаленного отладчика; но это не решило бы проблему, связанную с настройкой профилировщика, поскольку VisualVM (по крайней мере, с Java 6, обновление 26) не позволяет настраивать профилировщики на приостановленный процесс, поскольку он просто не отображает вкладку Профилировщик.