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

Почему отлаженная программа так сильно замедляется при использовании отладки ввода метода?

Я использую интерфейсы jdi для создания отладчика, и когда я использую MethodEntryRequests, чтобы включить отслеживание ввода метода, отлаженная программа замедляется в десятки раз. Я установил фильтр для основного потока и приостановил политику до SUSPEND_EVENT_THREAD. Classfilter ограничен, и если я печатаю любые полученные события, он не отображает более пары десятков из них, поэтому он не должен получать слишком много из них. Я отлаживаю локально и имею следующую команду командной строки с отлаженной программой java:

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

4b9b3361

Ответ 1

Короткий ответ заключается в том, что выполнение выполняется через интерпретатор при установке записей метода. Я не думаю, что это все равно...

Это имело место для всего кода, работающего в режиме отладки, но он был расширен в 1.4... теперь HotSpot работает для 'full -speed ', за исключением случаев ввода и вывода методов, точек наблюдения и одиночного шага или в методах, которые содержат точки останова.

Ответ 2

2 причины:

  • он должен добавлять проверки для каждой записи метода (нет возможности настроить только некоторые методы)
  • способ inlining становится невозможно (поэтому небольшие методы работают в 10-100 раз медленнее)

то же самое относится к профайлерам и .net-приложениям

Ответ 3

Я бы предположил, что отладчик должен просыпаться для каждого вызова метода, чтобы увидеть, совпадает ли он с теми, которые были выбраны для разрыва. Поскольку он должен проверять каждый вызов метода для потенциального совпадения, прежде чем он сможет его выполнить, он значительно медленнее, чем если бы он не выполнял все эти проверки.