Побочные эффекты запуска JVM в режиме отладки
Я хотел бы выпустить Java-приложение в режиме отладки, чтобы упростить отладку, когда на стороне клиента возникают случайные или трудно воспроизводимые проблемы.
Тем не менее, я хочу узнать о потенциальных побочных эффектах этого? Из документации Java HotSpot кажется, что не должно быть никакого снижения производительности.
По ссылке
Полная скорость отладки
Виртуальная машина Java HotSpot теперь использует отладку на полной скорости. В предыдущей версии виртуальной машины, когда была включена отладка, программа выполнялась с использованием только интерпретатора. Теперь все преимущества производительности технологии HotSpot доступны для программ, даже скомпилированного кода. Повышенная производительность позволяет легко отлаживать долго выполняющиеся программы. Это также позволяет проводить тестирование на полной скорости. Как только возникает исключение, отладчик запускается с полной видимостью для источников кода.
Является ли это точным или есть скрытые предостережения, как насчет памяти и есть ли другие скрытые ошибки при использовании режима отладки.
PS: я нашел эту статью от AMD, которая подтвердила мое первоначальное подозрение, что оригинальная статья из oricale не показывает полную историю.
Ответы
Ответ 1
Я не могу говорить для HotSpot и официально не буду для IBM, но я скажу, что есть определенные юридические виды оптимизации, которые невозможно полностью отменить, если в середине их потребуется декомпиляция, и таким образом, не включаются при запросе отладки в серийных JVM, которые вы, вероятно, будете использовать.
Представьте себе ситуацию, когда оптимизатор обнаруживает часть программы, доказуемо не требуется, и по различным языковым правилам (включая JSR 133) законно удалять, JVM захочет избавиться от нее. Одна морщина отлаживается: удаление кода будет выглядеть странно для человека, проходящего через него (переменные не обновляются, возможно, не останавливаются на линиях при шаге), поэтому выбор заключается в отключении упомянутых оптимизаций в этих случаях. То же самое может быть справедливо и для опций, например, для объектов с выделенным стеклом и т.д. Поэтому, когда JVM говорит, что "полная скорость" фактически приближается к "почти полной скорости", причем некоторые из самых популярных опций, которые невозможно отменить,.
Ответ 2
Если вы планируете запустить приложение с удаленной отладкой, оно также может повлиять на безопасность. Удаленная отладка оставляет порт открытым на вашем компьютере, и, подключившись к нему, я могу делать всевозможные забавные вещи с вашим приложением.
Ответ 3
Этот вопрос старый, но он возник, когда я искал какое-либо влияние на производительность, если вы просто оставите -agentlib: jdwp... включен, но не будете активно отлаживать.
Сводка: запуск с параметрами отладки, но без подключения, не должен влиять на скорость (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.
Я хотел бы услышать, сталкивался ли кто-нибудь с проблемами производительности в недавней виртуальной машине, просто оставляя порт включенным.
Ответ 4
Программа определенно делает намного больше, чем просто работает в режиме отладки, поэтому очевидно, что производительность не может быть одинаковой. Однако, если вы внимательно прочитаете выражение, в нем говорится, что новая версия может запускать полностью оптимизированный код, даже если в режиме отладки это было невозможно раньше. Таким образом, новый jvm намного быстрее, чем предыдущий, который мог работать только в интерпретируемом режиме без оптимизации.