Ответ 1
Некоторые интенсивные процедуры процессора становятся значительно медленнее при прохождении через отладчик. Почему это?
Поскольку JITTER не будет оптимизировать код так часто (часто, а не вообще), когда включена отладка.
Некоторые интенсивные процедуры процессора становятся значительно медленнее при прохождении через отладчик. Почему это?
В настоящее время я просто использую IntelliJ для выполнения кода, запущенного в JBoss. Когда я запускаю JBoss, я использую следующие опции:
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%
Есть ли способ ускорить выполнение? Или ускорить выполнение некоторых методов, которые мне не нужно выполнять?
Обновить. Кажется, если я не перехожу в/в интенсивные процессы с ЦП (т.е. просто запустите точку останова, установленную сразу после процедуры), тогда время выполнения, как если бы оно не было отладчик.
Некоторые интенсивные процедуры процессора становятся значительно медленнее при прохождении через отладчик. Почему это?
Поскольку JITTER не будет оптимизировать код так часто (часто, а не вообще), когда включена отладка.
Это также зависит от "стиля точек останова". Например. с точками наблюдения за переменными или установкой точек останова на уровне интерфейса (отладчик останавливается на всех реализациях метода при их исполнении) часто резко замедляет время процесса.
При отладке, помимо запуска приложения, вы также запускаете отладчик.
Код скомпилирован в режиме отладки с символами метаданных о локальных переменных и другой информации об исходном уровне. Отладчик читает информацию о том, какая строка исходного кода соответствует текущей инструкции. Этот процесс называется символической отладкой. Сохраненные символы увеличивают размер кода, и их интерпретация увеличивает время выполнения.
Некоторые отладчики на самом деле интерпретируют код "на лету", что почти всегда является крупным достижением производительности.
Дополнительная информация о режиме компиляции Java debug, который выполняется javac
и , включает в себя информацию об отладке в файлах классов: Java Параметры компилятора языка.
Например: -g
генерирует всю информацию отладки, включая локальные переменные.
Вам нужно учитывать, что другая программа - отладчик - подключена к вашей программе и следит за ней за такими исключениями. Он также контролирует текущую строку, чтобы реагировать на контрольные точки или запрошенные пользователем прерывания (например, запрос на паузу или состояние просмотра).
Отладка оптимизированного кода, созданного 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
Верхний Совет: в IDEA вы можете использовать ALT + F9 для выполнения туда, где у вас есть курсор, а не для установки дополнительной точки останова.
Я нашел анекдотически, что отладка становится очень медленной в IDEA, если вы ходите по коду, где есть много данных, доступных из стека. Не забывайте, что IDEA собирает эти данные (что-то в настоящее время в лексической области) и представляет ее вам как дерево объектов для просмотра, смотрите ли вы "смотреть" или нет, и делает это на каждом последующем шаге (возможно, он каждый раз воссоздает дерево?).
Это особенно заметно, когда, например, существует большая коллекция как переменная экземпляра "текущего" объекта.
Если вы используете Java 5, параметр для отладки:
-agentlib: JDWP = транспорт = транспорт по сокетам, сервер = у, приостановить = п, адрес =
и до Java 5
-Xdebug -Xrunjdwp: transport = dt_socket, address = 5005, server = y, suspend = n