Почему отлаживаемая программа сильно тормозит при использовании отладки записей метода? - PullRequest
33 голосов
/ 15 апреля 2009

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

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

Ответы [ 3 ]

31 голосов
/ 25 апреля 2009

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

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

11 голосов
/ 26 апреля 2009

2 причины:

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

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

5 голосов
/ 21 апреля 2009

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

...