Подтвердить что ты не робот

Почему 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%

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


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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

и до Java 5

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