Присоединение Java VisualVM для CPU-Profiling приводит к ошибке JVMTI 66

При использовании VisualVM для профилирования процессора моего приложения я сталкиваюсь с ошибкой

«Ошибка агента профилировщика: с сообщением: Ошибка повторного определения с ошибкой 66».

При этом он копирует все class-файлы из пути сборки в место, откуда я запустил приложение.

Я попытался найти некоторую информацию об этом, код ошибки означает (согласно JVMTI-документации):

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66)
Отличается непосредственный суперкласс для новой версии класса или отличается набор непосредственно реализованных интерфейсов.

Поскольку профилирование обычно работает в моей среде (сборка Java 1.7.0_09-b05, Fedora 17 64-бит). Я пробовал «-Xshare: off», как сказано в Visualvm-docs, без какого-либо эффекта.

Поскольку это единственное приложение Java-SE, с которым я столкнулся с этой проблемой, кажется, что это как-то связано с библиотеками, которые я использую. В моем пути к классам находятся следующие:

  • Log4j 1.2.17
  • Apache OpenJPA 2.2.1
  • Общая конфигурация 1.9
  • Общий пул 1.6
  • Postgresql 9.1-901jdbc4
  • imgscalr-lib-4.2

Может ли кто-нибудь увидеть корреляцию между библиотеками и ошибкой? У меня действительно больше нет идей.


person chrisstr    schedule 25.12.2012    source источник
comment
Реализации JPA, как правило, выполняют инструментирование байт-кода (необходимо для поддержки таких вещей, как ленивая загрузка). если это не слишком много работы, попробуйте сменить провайдера JPA?   -  person radai    schedule 26.12.2012
comment
Openjpa глубоко вложен, и из-за (по моей информации) уникальной обработки отсоединения/присоединения управляемых объектов, к сожалению, его невозможно переключить.   -  person chrisstr    schedule 29.12.2012


Ответы (2)


Похоже, это может быть вызвано JPA. Вы можете использовать Sampler вместо Profiler. Другая возможность — определить корневые методы и инструментальный фильтр, чтобы классы, оснащенные JPA, не профилировались VisualVM. См. Профилирование с помощью VisualVM, часть 1 и Профилирование с помощью VisualVM, часть 2, чтобы получить дополнительную информацию о профилировании и о том, как установить корни профилирования и инструментальный фильтр.

person Tomas Hurka    schedule 28.12.2012
comment
Спасибо за подсказку - выборка проходит без проблем. На самом деле (позор мне) я всегда думал, что делаю то, что делает выборка, когда использую опцию профилирования. - person chrisstr; 29.12.2012

Небольшое дополнение: у меня было такое же сообщение об ошибке при профилировании приложения, использующего OpenJPA. Ошибки, похоже, исчезают после простого нажатия «ОК» в каждом диалоговом окне ошибок, если вы не закрываете приложение.

Таким образом, вы можете просто нажать кнопку, чтобы сбросить собранные результаты и снова запустить код. Например. запустив его в цикле и используя new Scanner(System.in).nextLine() или нажав кнопку в пользовательском интерфейсе.

person Henno Vermeulen    schedule 22.04.2015
comment
Примечание! К сожалению, JVisualVM не показывает напрямую вызовы методов в объектах JPA. В зависимости от того, чего вы хотите достичь, это может быть или не быть проблемой. - person Henno Vermeulen; 22.04.2015