Почему код Java замедляется в отладчике? - PullRequest
20 голосов
/ 04 февраля 2010

Некоторые подпрограммы с интенсивным использованием ЦП значительно замедляются при запуске через отладчик. Почему это?

В настоящее время я просто использую IntelliJ для пошагового выполнения кода, выполняемого в JBoss. Когда я запускаю JBoss, я использую эти опции:

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%

Есть ли способ ускорить выполнение? Или ускорить выполнение определенных методов, которые мне не нужно выполнять?


Обновление : Похоже, если я не перешагну / в подпрограммы с интенсивным использованием ЦП (т. Е. Просто запускаю до точки останова, установленной сразу после подпрограммы), тогда время выполнения будет как будто отладчик.

Ответы [ 7 ]

42 голосов
/ 04 февраля 2010

Некоторые подпрограммы с интенсивным использованием ЦП значительно замедляются при запуске через отладчик. Почему это?

Поскольку JITter не будет оптимизировать код так часто (часто, вообще не оптимизировать), когда включена отладка.

7 голосов
/ 04 февраля 2010

Это также зависит от «стиля точек останова».Например, наличие точек наблюдения для переменных или размещение точек останова на уровне интерфейса (отладчик останавливается во всех реализациях методов, когда они выполняются) часто значительно замедляет время процесса.

5 голосов
/ 04 февраля 2010

При отладке, помимо запуска приложения, вы также запускаете отладчик.

Код скомпилирован в режиме отладки с символами метаданных о локальных переменных и другой информацией на уровне источника. Отладчик читает, чтобы узнать, какая строка исходного кода соответствует текущей инструкции. Процесс называется символьная отладка . Сохраненные символы увеличивают размер кода, а их интерпретация увеличивает время выполнения.

Некоторые отладчики на самом деле интерпретируют код на лету, что почти всегда сильно сказывается на производительности.

Дополнительная информация о режиме компиляции отладки Java, который выполняется javac и , включает отладочную информацию в файлы классов : Параметры компилятора языка Java . Например: -g генерирует всю информацию отладки, включая локальные переменные.

2 голосов
/ 04 февраля 2010

Вам нужно учитывать, что другая программа - отладчик - подключена к вашей программе и следит за ней, например, за исключениями.Он также отслеживает текущую строку, чтобы реагировать на точки останова или прерывания, запрошенные пользователем (например, запрос на паузу или условие наблюдения).

1 голос
/ 04 февраля 2010

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

Таким образом, взлом функции в отладчике заставляет JVM деоптимизировать метод, через который вы проходите.Hotspot вообще не генерирует собственный код и просто интерпретирует байт-код метода.

До JDK 1.4.1 запуск с включенной отладкой заставлял JVM использовать только интерпретатор: http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_3.html#full

0 голосов
/ 03 июля 2014

Если вы используете Java 5, параметр для отладки:

-agentlib: JDWP = транспорт = транспорт по сокетам, сервер = у, подвесьте = п, адрес =

и до Java 5

-Xdebug -Xrunjdwp: transport = dt_socket, address = 5005, server = y, suspend = n

0 голосов
/ 04 февраля 2010

Главный совет: в IDEA вы можете использовать ALT + F9, чтобы перейти туда, где вы поместили курсор, вместо того, чтобы установить дополнительную точку останова.

Я обнаружил анекдотически, что отладка становится медленной очень в IDEA, если вы просматриваете код, где из стека доступно много данных. Не забывайте, IDEA собирает эти данные (все, что в данный момент входит в лексическую область) и представляет их вам в виде дерева объектов для просмотра, «смотрите» вы или нет, и делает это на каждый последующий шаг (может быть, это заново создает дерево каждый раз?).

Это особенно очевидно, когда, например, существует большая коллекция в качестве переменной экземпляра «текущего» объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...