Почему VisualVM Profiler не профилирует мое приложение?
Я создал простое однофайловое Java-приложение, которое выполняет итерации по циклу, вызывает некоторые функции, выделяет часть памяти, добавляет некоторые числа и т. Д. Я запускаю это приложение с помощью eclipse. Run As->Java Application
,
Запущенное приложение отображается в Java VisualVM под Local
,
Я дважды щелкаю на этом приложении и перехожу на вкладку Profiler.
Настройки по умолчанию:
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
,
Что я здесь не так делаю? Есть ли какие-то настройки, которые мне нужно настроить? Нужно ли устанавливать флаг виртуальной машины при запуске приложения?
7 ответов
Я предполагаю, что проблема связана с приложением, запускаемым из 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's temp directory]
явно сказать ему, где эти данные.
Если вы не можете найти hsperfdata_$USER
папку, попробуйте просто запустить ваше приложение вне Eclipse обычным способом командной строки Java.
Также обратите внимание, что была ошибка, затрагивающая временную папку (чувствительность к регистру), появившаяся около 1.6.0_23, так что, возможно, вы выиграете, обновившись до более новой сборки Java 6 (или 7)?
У меня была такая же проблема после обновления Java 1.7.0_45. Мне пришлось удалить следующую папку:
C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
После этого все работает как шарм.
У меня была та же проблема, и запуск VisualVM с повышенными правами (права администратора) решил эту проблему.
Микавели, Куба и Сомайя Кумбера предоставили отличные решения. Просто добавляю, что я сделал, чтобы все заработало.
Я сначала проверил местоположение C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
Не было файла с идентификатором процесса моей программы, запущенной в eclipse.
Я просто остановил программу и добавил следующий параметр в Конфигурации запуска программы (Конфигурации запуска -> Аргументы -> Аргументы виртуальной машины) -Djava.io.tmpdir=C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
Я снова запустил программу. Все еще не мог профилировать это. Но теперь у меня есть файл, созданный для процесса в данном временном каталоге.
Затем простой перезапуск VisualVM сделал свое дело.
У меня была та же проблема, но со следующими симптомами:
Я запустил Jetty с рабочим каталогом в C: \ Users \ t852124 \ AppData \ Local \ Temp
Jetty создала каталог hsperfdata_, но не указала в нем идентификатор процесса
Поэтому, когда я запустил VisualVM, он не мог получить информацию о процессе Java.
Я решил это, запустив jetty с опцией -Djava.io.tmpdir=C:/temp/java.
Теперь, когда я запустил Jetty, идентификатор процесса был создан в виде файла в каталоге hsperfdata_. Поэтому, когда я запустил VisualVM, он смог увидеть мой локальный процесс Java
В Linux с VisualVM 1.3.3 я должен удалить локальные настройки приложения в ~/.visualvm/1.3.3/
включить CPU Profiler и CPU Sampler.
Также обратите внимание, что /usr/bin/jvisualvm содержит жестко заданный путь к OpenJDK (устанавливается с jdkhome
переменная), которая, по-видимому, вызывает много проблем по сравнению с работой с Oracle JDK 1.7.
Также обратите внимание, что если ваше приложение использует недавнюю JVM, отличную от Oracle, вам может потребоваться загрузить "передовой край" VisualVM с github.
Например, VisualVM в комплекте с JDK 1.8.0.111, похоже, не работает с IBM 1.8 JVM. Возможно, IBM JVM была просто выпущена после Oracle 1.8 JVM, поэтому включение необходимых изменений в то время было невозможно.