Почему приложение VisualVM Profiler не будет использовать мое приложение?
Я создал простое приложение с 1 файлом java, которое выполняет итерацию через цикл, вызывает некоторые функции, выделяет некоторую память, добавляет некоторые числа и т.д. Я запускаю это приложение через eclipse Run As->Java Application
.
Запустившееся приложение отображается в Java VisualVM под Local
.
Я дважды нажимаю на это приложение и перехожу на вкладку "Профайлер".
Настройки по умолчанию:
Start profiling from classes: my.main.package.**
Do not profile classes: java.*, javax.*,
sun.*, sunw.*, com.sun.*
Я нажимаю CPU
. Кнопки CPU
и Memory
серого цвета. Ничего не происходит.
Status
говорит profiling inactive
.
Когда мое приложение завершает Status
говорит application terminated
.
Что я здесь делаю неправильно? Есть ли какие-то настройки, которые мне нужно настроить? Нужно ли устанавливать флаг VM при запуске приложения?
Ответы
Ответ 1
Я бы предположил, что проблема связана с запуском приложения из Eclipse, это связано с тем, что JVisualVM ожидает найти данные в каталоге java.io.tmpdir
(обычно C:\Users\[your username]\AppData\Local\Temp\hsperfdata_[your username]
в системе Windows).
Я предполагаю, а не в обычном месте, где JPS, JVisualVM и т.д. ожидает его, Eclipse помещает данные в свою собственную временную папку?
Если это так, попробуйте вызвать JVisualVM с помощью jvisualvm -J-Djava.io.tmpdir=[Eclipse temp directory]
, чтобы явно указать, где находятся эти данные.
Если вы не можете найти папку hsperfdata_$USER
, попробуйте запустить приложение вне Eclipse в обычной командной строке Java.
Также обратите внимание, что произошла ошибка, влияющая на временную папку (чувствительность к регистру), введенную около 1.6.0_23, так что, возможно, вам будет полезно обновить более новую версию Java 6 (или 7)?
Ответ 2
У меня была такая же проблема после обновления java 1.7.0_45. Мне пришлось удалить следующую папку:
C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
После этого все работает как шарм.
Ответ 3
У меня была такая же проблема, но со следующими симптомами:
Я начал причал, с рабочим каталогом в
C:\Users\t852124\AppData\Local\Temp
Jetty создавал каталог hsperfdata_, но не устанавливал в нем идентификатор process
Итак, когда я начал visualVM, он не смог получить информацию о процессе java.
Я решил это, отправив причал с параметром -Djava.io.tmpdir = C:/temp/java.
Теперь, когда я начал причал, идентификатор процесса был создан как файл в каталоге hsperfdata_.
Поэтому, когда я начал visualVM, он смог увидеть мой локальный процесс Java
Ответ 4
Микавели, Куба и Сомайя Кумбер предоставили отличные решения. Просто добавив, что я сделал, чтобы все работало.
Я сначала проверил местоположение C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
Не было файла с именем процесса моей программы, запущенной внутри eclipse.
Я просто остановил программу и добавил следующий параметр в Run Configurations программы (Запустить конфигурации → Аргументы → Аргументы VM)
-Djava.io.tmpdir=C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
Я снова начал программу. Все еще не удалось его прокомментировать. Но теперь у меня есть файл, созданный для процесса в заданной директории temp.
Тогда простой перезапуск VisualVM сделал трюк.
Ответ 5
В Linux с VisualVM 1.3.3 мне нужно удалить локальные настройки приложения в ~/.visualvm/1.3.3/
, чтобы включить прокси-сервер и прокси-сервер CPU.
Также обратите внимание, что /usr/bin/jvisualvm содержит hardcoded путь к OpenJDK (устанавливается с переменной jdkhome
), что, по-видимому, вызывает множество проблем, сравнивая с запуском на Oracle JDK 1.7.
Ответ 6
У меня была такая же проблема, и работа с VisualVM с повышенными привилегиями (правами администратора) решила проблему.
Ответ 7
Также обратите внимание, что если ваше приложение использует недавнюю не-Oracle JVM, вам может потребоваться загрузить "bleeding edge" VisualVM из github.
Например, VisualVM в комплекте с JDK 1.8.0.111, похоже, не работает с JVM IBM 1.8. Возможно, IBM JVM была просто выпущена после JVM Oracle 1.8, поэтому включение необходимых изменений в это время было невозможным.