Java JVMTI не работает параллельно -Xdebug -Xrunjdwp
Вопрос
Я потратил последние 4 часа, пытаясь настроить память Eclipse TPTP профилирование в экземпляре Tomcat, который должен запускаться удаленно (т.Е.не в Eclipse).Это должно быть возможно в соответствии с TPTP и Agent Документы контроллера.
Я установил компоненты tptp, с помощью (4.6.0) в моем затмение (Галилей) верстак вместе с агентом контроллера в соответствии с инструкции на сайте.Чтобы включить агент, я добавил следующие параметры в командную строку, которая запускает экземпляр Tomcat:
-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true
и добавил следующие каталоги в начало ПУТИ:
D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler
D:\dev\tools\ac\bin
При попытке запустить Tomcat я постоянно получал следующую ошибку сообщение:
ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279]
Я много поискал в Google, но не нашел ничего подходящего;Я попытался переустановить TPTP и различные версии контроллера агента.
В итоге проблема оказалась в том, что я запускал Tomcat с опцией "jpda", которая catalina.bat переводится как
-Xdebug -Xrunjdwp:transport=.....
Удаление аргумента команды "jpda" привело к тому, что JVMTI начал работать.
ИТАК, вопрос в том,:Я не нашел ничего во время любого из моих поисков, чтобы указать, что агент JVMTI несовместим с отладкой.Может кто-нибудь объяснить, что происходит и почему JVMTI + JDWP не является допустимым настройка?
Решение
Ни один из ответов на данный момент не является правильным, и это первое сообщение, которое появляется в Google, если вы запрашиваете указанную ошибку, поэтому я чувствую, что необходимо некоторое разъяснение.
JVMTI и JDWP делай работайте вместе, на самом деле они обычно должны использоваться вместе.Вы получите ERROR: JDWP unable to get necessary JVMTI capabilities
если -Xrunjdwp
(и/или, возможно -agentlib:jdwp
) указывается более одного раза в командной строке.Чтобы исправить это, убедитесь, что у вас есть только один из -Xrunjdwp
или -agentlib:jdwp
в вашей командной строке.
Для получения более подробной информации читайте дальше...
JVMTI (Java Virtual Machine Tool Interface) является преемником JVMDI (Java Virtual Machine Debug Interface Интерфейс отладки виртуальной машины) и JVMPI (Java Virtual Machine Profiling Interface Интерфейс профилирования виртуальной машины).Он включает в себя функциональность как JVMDI, так и JVMPI, которые устарели в Java 5 и были удалены в Java 6.Это API, который предоставляет доступ к внутренним компонентам JVM для целей отладки и профилирования.
JDWP (Java Debug Wire Protocol) - это протокол, который описывает простой механизм передачи команд и ответов.Насколько я знаю, это единственный способ для отладчика, находящегося вне JVM, взаимодействовать с ним и с JVMTI.
JDI (Java Debugger Interface) - это API на стороне клиента (debugger-side), который предоставляет некоторые функции JVMTI при более или менее прозрачном использовании JDWP.
В ошибка упомянутое в ответе Боба Доббса касается вводящего в заблуждение сообщения об ошибке и того факта, что JVM будет пытаться загрузить JDWP один раз за каждый раз, когда оно указано в командной строке.Нигде не указано, что JDWP и JVMTI не могут использоваться вместе.
Более подробная информация здесь: https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/rzaha/jpdebuga.htm
Другие советы
Я столкнулся с той же проблемой, что и вы, но я получил сообщение об ошибке JVM (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345), которые проливают некоторый свет на проблему.В основном это сводится к тому, что библиотека Java agent никогда не предназначалась для двойной загрузки в одну и ту же виртуальную машину.Отстой, но, похоже, это основное ограничение системы агентов, что вы не можете делать и то, и другое одновременно.
Для меня это была та же проблема, что и Code Bling post, они были дубликатами -Xrunjdwp
не знал, что был второй -Xrunjdwp
поскольку это было скрыто в переменной %JAVA_OPTIONS%
, проверьте сценарий запуска вашего сервера приложений.