Почему код Java замедляется в отладчике?

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

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

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

Существует ли способ ускорить выполнение? Или ускорять определенные осуществления метода, что я не должен ступать через?


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

20
задан Marcus Leon 4 February 2010 в 03:04
поделиться

6 ответов

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

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

42
ответ дан 29 November 2019 в 23:02
поделиться

Top Tip: в IDEA можно использовать ALT + F9 для перехода к месту установки курсора, а не к дополнительной точке останова.

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

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

-121--2125230-

Потому что тогда у вас будет два способа что-то сделать.

-121--2338726-

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

2
ответ дан 29 November 2019 в 23:02
поделиться

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

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

Некоторые отладчики фактически интерпретируют код «на лету», что почти всегда сильно снижает производительность.

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

5
ответ дан 29 November 2019 в 23:02
поделиться

Это также зависит от "стиля точек останова". Например, наличие точек останова на переменных или установка точек останова на уровне интерфейса (отладчик остановится на всех методах-внедренениях при их выполнении) часто резко замедляет время процесса.

7
ответ дан 29 November 2019 в 23:02
поделиться

Отладка оптимизированного кода, созданного 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

1
ответ дан 29 November 2019 в 23:02
поделиться

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

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

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

0
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: