Побочные эффекты запуска JVM в режиме отладки

Я хотел бы выпустить Java-приложение в режиме отладки, чтобы упростить отладку, когда на стороне клиента возникают случайные или трудно воспроизводимые проблемы.

Тем не менее, я хочу узнать о потенциальных побочных эффектах этого? Из документации Java HotSpot кажется, что не должно быть никакого снижения производительности.

По ссылке

Полная скорость отладки

Виртуальная машина Java HotSpot теперь использует отладку на полной скорости. В предыдущей версии виртуальной машины, когда была включена отладка, программа выполнялась с использованием только интерпретатора. Теперь все преимущества производительности технологии HotSpot доступны для программ, даже скомпилированного кода. Повышенная производительность позволяет легко отлаживать долго выполняющиеся программы. Это также позволяет проводить тестирование на полной скорости. Как только возникает исключение, отладчик запускается с полной видимостью для источников кода.

Является ли это точным или есть скрытые предостережения, как насчет памяти и есть ли другие скрытые ошибки при использовании режима отладки.

PS: я нашел эту статью от AMD, которая подтвердила мое первоначальное подозрение, что оригинальная статья из oricale не показывает полную историю.

4 ответа

Решение

Я не могу говорить за HotSpot, и не буду официально за IBM, но я скажу, что, безусловно, существуют легальные виды оптимизации, которые невозможно полностью отменить, если в середине потребуется декомпиляция, и, таким образом, это не так. t включается, когда запрашивается отладка в производственных JVM, которые вы, вероятно, будете использовать.

Представьте себе ситуацию, когда оптимизатор обнаруживает, что часть программы, по-видимому, не требуется, и по различным языковым правилам (включая JSR 133) законно удалить, JVM захочет избавиться от него. Единственный недостаток - отладка: удаление кода будет выглядеть странно для человека, проходящего через него (переменные не обновляются, возможно, не останавливаются в строках при переходе), поэтому выбор состоит в том, чтобы отключить указанные оптимизации в этих случаях. То же самое можно сказать и об опциях, таких как объекты, размещенные в стеке, и т. Д., Поэтому, хотя JVM говорит, что это "полная скорость", на самом деле она ближе к "почти полной скорости", с некоторыми из более забавных опций, которые нельзя полностью отменить ".,

Этот вопрос старый, но он возник, когда я искал какое-либо влияние на производительность, если вы просто оставляете -agentlib:jdwp... on, но не активно отлаживаете.

Сводка: запуск с параметрами отладки, но без подключения, не должен влиять на скорость (Java 7+).

ТЛ / дг:

До выпуска java 6 (ish) вы использовали -Xdebug, и это имело определенный эффект, оно отключило JIT!

В java 6 они изменили его на -agentlib и сделали его лучше. Были некоторые ошибки, хотя это приводило к снижению производительности. Вот одна из ошибок, которые были поданы против openjdk. Я предполагаю, что были похожие проблемы с версией oracle/sun: https://bugs.openjdk.java.net/browse/JDK-6902182

Однако обратите внимание, что заявленная цель заключается в том, что простое включение отладки путем открытия порта не должно приводить к снижению производительности.

Похоже, что, по крайней мере в openjdk, ошибки были устранены с помощью Java 7. Я ничего не видел о влиянии на производительность после этого.

Если вы продолжите изучение этого вопроса и обнаружите отрицательные результаты, обратите внимание на версию Java, в которой проводилось тестирование - все, что я видел, было связано с версиями до 7.

Я хотел бы услышать, сталкивался ли кто-нибудь с проблемами производительности в недавней виртуальной машине, просто оставляя порт включенным

Если вы планируете запускать приложение с включенной удаленной отладкой, это также может повлиять на безопасность. Благодаря удаленной отладке порт на вашей машине остается открытым, и, подключившись к нему, я могу делать с вашим приложением самые разные забавные вещи.

Программа определенно делает гораздо больше, чем просто работает в режиме отладки, поэтому очевидно, что производительность не может быть одинаковой. Однако, если вы внимательно прочитаете инструкцию, она говорит, что в новой версии может выполняться полностью оптимизированный код, даже если в режиме отладки это было невозможно ранее. Таким образом, новый jvm намного быстрее предыдущего, который может работать только в интерпретируемом режиме, который не требует оптимизации.

Другие вопросы по тегам