Работают ли классы фильтрации для профилирования ЦП в Java VisualVM?

Я хочу отфильтровать, какие классы профилируются по процессору в Java VisualVm (версия 1.7.0 b110325). Для этого я попытался в разделе «Профилировщик» -> «Настройки» -> «Параметры процессора» установить «Профилирование только классов» для моего тестируемого пакета, что не дало результата. Затем я попытался избавиться от всех классов java. * И sun. *, Установив их в «Не профилировать классы», что тоже не помогло.

Это просто ошибка? Или я что-то упускаю? Есть ли обходной путь? Я имею в виду кроме:

Я хочу сделать это в основном для того, чтобы получить половину правильного процента потребляемого ЦП для каждого метода. Для этого мне нужно избавиться от надоедливых измерений, например для sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() (около 70%). Кажется, у многих пользователей есть эта проблема, см., Например,


person DaveFar    schedule 26.08.2011    source источник
comment
Ваша цель - заставить код работать как можно быстрее? или просто получить проценты, независимо от того, что они означают? Время, как его обычно используют, весьма неоднозначно.   -  person Mike Dunlavey    schedule 26.08.2011
comment
Да, моя главная цель - ускорить выполнение кода. Я также хотел бы получить оценку того, какая часть кода должна измениться. Итак, я хочу получить общий обзор всех горячих точек и их серьезности. Я думаю, что результаты VisualVm были бы приемлемы для этого, несмотря на использование времени стены - если бы только эти несколько классов sun. * И java. * Не испортили бы всю статистику.   -  person DaveFar    schedule 26.08.2011


Ответы (2)


Причина, по которой вы видите sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() в профиле, заключается в том, что вы оставили выбранной опцию Профилировать новые Runnables.

Кроме того, если вы сделаете снимок своего сеанса профилирования, вы сможете увидеть весь стек вызовов для любого метода точки доступа - таким образом вы сможете перейти от метода run() к методам логики вашего собственного приложения, отфильтровывая шум, создаваемый тегом < strong> Профиль новых Runnables.

person JB-    schedule 27.08.2011
comment
Спасибо, JB (+5), я проверю эту опцию в понедельник - похоже на решение :) Я сделал снимок, который дал мне представление дерева вызовов, что бесполезно, поскольку только представление профилировщика дает мне процент потребленных ЦП на метод. Из-за рекурсии мой стек вызовов слишком сложен, чтобы получить из него разумную информацию о производительности. - person DaveFar; 27.08.2011
comment
Спасибо, JB, отключение опции Profile new Runnables помогло. - person DaveFar; 29.08.2011
comment
Обратите внимание на последствия отключения вышеупомянутой опции. Если этот параметр включен, вы автоматически получите информацию обо всех недавно запущенных потоках / исполняемых файлах. Если эта опция отключена, вы должны обязательно предоставить исчерпывающий список корневых методов. - person JB-; 30.08.2011

Хорошо, поскольку ваша цель - заставить код работать как можно быстрее, позвольте мне предложить, как это сделать. Я не эксперт по VisualVM, но могу сказать, что работает. (Только несколько профилировщиков на самом деле говорят вам то, что вам нужно знать, а именно - какие строки вашего кода находятся в стеке за здоровую часть времени настенных часов.)

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

Если вы не хотите делать произвольная пауза, выбор на ваше усмотрение, но доказано, что это работает, и вот пример ускорения в 43 раза.

По сути, идея состоит в том, что вы получаете (небольшое, вроде 10) количество выборок стека, взятых в произвольное время настенных часов. Каждая выборка состоит (очевидно) из списка сайтов для звонков и, возможно, в конце сайта, где не звонят. (Если образец находится во время ввода-вывода или в спящем режиме, он завершится системным вызовом, и это нормально. Это то, что вы хотите знать.)

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

Я не знаю всех профилировщиков, но знаю одного, который может сказать вам, что это Zoom. Другие могут это сделать. Они могут быть более элегантными, но они не работают быстрее или лучше, чем ручной метод, когда ваша цель - максимизировать производительность.

person Mike Dunlavey    schedule 26.08.2011
comment
Имейте в виду, что в JVM может случиться так, что метод никогда не появится в трассировке стека, даже если выполняется довольно часто. Причина этого в том, что JVM позволяет брать трассировку стека - трассировку стека потока можно брать только в контрольной точке, которая не может быть вставлена ​​JIT в каждый отдельный метод. - person JB-; 27.08.2011
comment
Ты - случайный проповедник, делающий паузу, Майк :) В любом случае спасибо за ответ, я бы поддержал его, если бы я уже не дал тебе ссылку, описывающую эту технику. Я пробовал, но из-за рекурсии стек вызовов довольно сложен. Представление профиля разбивает его на методы с процентом времени выполнения, поэтому горячие точки намного легче увидеть. Во-вторых, вид профиля показывает все горячие точки и их степень тяжести. Это дает хорошее представление о том, что и сколько нужно настроить. Вы согласны? - person DaveFar; 27.08.2011
comment
@DaveBall: Дело не в точках доступа и измерениях. Да, стек вызовов сложный, и есть рекурсия. Тем не менее, посмотрите, сможете ли вы выделить все это и скопировать в редактор. Затем изучите его и посмотрите, сможете ли вы ответить на простой вопрос: «Что он делает в данный момент и почему? Затем сделайте это еще раз несколько раз. Это покажет вам, на что он тратит время, и покажет, на чем вам следует сосредоточиться. Не пугайтесь рекурсии или сложного стека. Любая строка кода, которую вы видите в 2 образцах из 3, в среднем обходится вам в (2 + 1) / (3 + 2) = 60%. Удачной охоты. - person Mike Dunlavey; 27.08.2011
comment
@DaveBall: Чем глубже стек, тем лучше охота. Поскольку вы упомянули о рекурсии, я бы рискнул сделать ставку, что это причина потраченного времени. По моему опыту, рассредоточенные уведомления - одна из основных причин проблем с производительностью. (Кстати: горячие точки (где концентрируется ПК) почти никогда не имеют значения в реальном коде, таком как ваш. Также, если вы видите функцию с высоким процентом включения, вы собираетесь заглянуть внутрь нее - неправильно! Посмотрите, почему она вызывается. Профилировщики не Я вам этого не говорю. Образцы стека говорят.) - person Mike Dunlavey; 27.08.2011
comment
@DaveBall: Извини, что продолжаю. (Ненавижу евангелистов.) Вы взяли 1 образец и увидели много рекурсий. Правило преемственности говорит, что в среднем, когда это происходит, эта рекурсия стоит вам (1 +1) / (1 + 2) = 67%. Так что велики шансы, что вы уже нашли проблему. - person Mike Dunlavey; 27.08.2011
comment
@Mike: Не нужно извиняться, спасибо за приложенные усилия. Но проблема не в самой рекурсии, DFS, а в том, что посетитель выполняет на каждом этапе обхода. Следовательно, единственная информация, имеющая отношение к стеку вызовов, - это часть внутреннего вызова рекурсии. Поскольку посетитель выполняет задачи в различных ситуациях (visitNode, visitEdge, backtrackNode, backtrackEdge, recursionTermination), мне пришлось бы делать много выборок, чтобы получить полную картину горячих точек. Поскольку я предпочитаю автоматизацию повторяющейся ручной работе, я предпочитаю профилировщик. - person DaveFar; 28.08.2011
comment
@DaveBall: Ничего страшного. Я просто указываю на то, что когда вы поймете, что можно исправить, что значительно сэкономит время, вы увидите, что это было перед вами в ›1 из первых нескольких образцов стека. - person Mike Dunlavey; 28.08.2011