Как повторно преобразовать исполняемый метод с агентом JVMTI, у которого больше нет вызовов?

Я инструментирую файл класса во время выполнения для различных целей. Для этого я использую агент JVMTI. Моя стратегия инструментирования метода состоит в том, чтобы вызвать функцию RetransformClasses для вызова ClassFileLoadHook. Эта стратегия отлично работает для всех методов, которые вызываются после момента инструментирования, потому что фактическое инструментирование происходит при последующем вызове функции, но она не работает для любого метода, который не имеет дополнительных вызовов, таких как функция main в программе.

Я хочу инструментировать метод на лету во время его выполнения. Мне нужна какая-то процедура, такая как замена в стеке (OSR) инструментированного кода. Есть ли какая-либо стратегия в JVMTI или любой другой подход????

PS: я открыт для редактирования/исправления исходного кода OpenJDK, если это может помочь.


person Saqib Ahmed    schedule 23.01.2017    source источник
comment
Чего я не понимаю: учитывая тот факт, что такой метод никогда не будет вызываться; какой смысл его инструментировать? Я имею в виду: инструментарий не дает вам понимания, когда метод вызывается позже; например, когда метод вызывается?   -  person GhostCat    schedule 01.02.2017
comment
Вы правы в том, что касается инструментов для профилирования. Я инструментирую свой код для распараллеливания длинных циклов в методе. Поэтому, если у вас есть утомительный цикл в вашем main, я хотел бы настроить его так, чтобы он порождал несколько потоков и объединял их (если, конечно, это можно распараллелить). Вот почему я столкнулся с инструментированием функций одиночного вызова.   -  person Saqib Ahmed    schedule 02.02.2017
comment
Вы смотрели в javaagent?   -  person Dennis C    schedule 02.02.2017
comment
@ ДеннисС Да. Я начал с Javaagent. Я пробовал ASM и Javassist. Javagent также использует ту же стратегию на своем бэкэнде. Для динамического инструментария времени выполнения это будет делать то же самое. То есть инструментировать последующие вызовы, если таковые имеются.   -  person Saqib Ahmed    schedule 02.02.2017
comment
КСТАТИ. Не слишком доверяйте OSR. Я читал, что проект Lucene обычно обнаруживает несколько ошибок в горячей точке из-за OSR и оптимизатора каждый раз, когда выпускается новый jdk.   -  person Dennis C    schedule 02.02.2017
comment
Что ж, я думаю, это может быть причиной отсутствия эквивалента OSR в случае приборов. ????   -  person Saqib Ahmed    schedule 02.02.2017


Ответы (1)


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

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

Итак, вместо реального решения у меня в основном есть список проблем:

  • Прежде всего, если вы даже хотите изменить методы, которые уже были запущены и выполняются в настоящее время, вы имеете в виду не только инструменты. Что вы на самом деле хотите сделать, так это предоставить свой собственный механизм JIT, в то время как JIT JVM также существует и выполняет свою работу.
  • Итак, если вы действительно серьезно относитесь к этому; и хотите убедиться, что даже вещи в любом main() могут извлечь выгоду из ваших оптимизаций - тогда, я думаю, концептуально вам лучше спроектировать и реализовать свою собственную JVM.
  • Тогда мне интересно: вы говорите, что хотите охватить main() методы, которые уже запускают «длительные циклы». Похоже, вы намереваетесь исправить плохой дизайн, используя свои инструменты. Я думаю, что более разумный подход: изучить такие приложения и улучшить их дизайн.
  • В смысле: если бы "распараллеливание" произвольных приложений было бы "так просто" - это все равно было бы частью JVM. А то, что это не так; и то, что JVM не выполняет такого рода оптимизации, есть веская причина: вероятно, очень сложно сделать это правильно и надежно.

Другими словами: я предполагаю, что у вас проблема XY; и проблема X заключается в том, что приложения, с которыми вы работаете, могут выиграть от «распараллеливания». Но это то, что очень трудно сделать «вообще».

В этом смысле; Я бы предпочел определить какую-то архитектуру (которая может включать конкретные, четко определенные шаги, как приложение должно «запускаться»; чтобы ваши инструменты могли успешно выполнять свою работу) и сначала получить опыт с этим подходом. Значение: скажите своим людям, чтобы они не помещали «длинные рабочие циклы» в свои main() в первую очередь (как уже было сказано; само по себе это звучит как довольно плохой дизайн для меня!).

person GhostCat    schedule 02.02.2017
comment
У тебя получилось более-менее. Моя главная задача — использовать неявный параллелизм в java-кодах, предполагая, что у меня нет java-источника приложения. Что касается анализа, я анализирую байт-код на предмет параллелизма, и это прекрасно работает. Очевидно, это действительно сложно анализировать, но это не моя главная задача. Я просто озабочен переопределением своих классов на лету. Я уже инструментирую свои классы во время загрузки класса и получаю желаемые результаты. Теперь я хочу использовать JIT-профилировщик, чтобы отсеять для меня несколько горячих точек и распараллелить только их. - person Saqib Ahmed; 02.02.2017
comment
Причина использования хотспотов также очевидна. Аксиома: каждый цикл не стоит распараллеливать. Есть только горячие точки. Имея это в виду, я, естественно, склоняюсь к тому, чтобы активировать активные точки в коде. И вот появляется динамическая инструментация времени выполнения. - person Saqib Ahmed; 02.02.2017
comment
Я анализирую байт-код на предмет параллелизма, и это работает отлично ... это довольно смелое заявление ;-) ... Мне интересно, что вы обнаружили, что миллионы людей, занимающихся исследованиями в этой области, до сих пор упускали из виду. - person GhostCat; 02.02.2017
comment
Ага. Извините, это производит такое впечатление. :-) Я имел в виду, что моя система работает до сих пор, и у меня есть законченный прототип. Я не хотел сказать, что нашел какой-то новый подход к анализу параллелизуемости. И я обнаружил нечто под названием JAVAB. Это инструмент распараллеливания байт-кода. - person Saqib Ahmed; 02.02.2017
comment
Тем не менее... звучит интересно. Будет ли это с открытым исходным кодом в какой-то момент. В любом случае; Я надеялся на свою первую награду за награду, но пока кажется, что ответ даже не стоит голосовать за людей, которые приходят... но я буду продолжать думать; и, возможно, у меня будет еще какой-нибудь полезный контент позже. - person GhostCat; 02.02.2017
comment
К вашему сведению: я добавил в этот чат кое-какой контент. - person GhostCat; 03.02.2017
comment
Проблема в том, что OSR выполняется путем генерации оптимизированного кода ограниченным образом, так что существует общая точка, в которой управление может быть передано от старого кода к новому. Это основано на том факте, что оптимизированный код по-прежнему делает то же самое, что и старый код, по крайней мере, семантически. Инструментарий позволяет вам заменить код каким-то произвольным кодом, не требующим того же самого, даже семантически. Параллельный код вряд ли имеет что-то общее с последовательным кодом, не говоря уже о точке безопасной передачи управления (в середине цикла). - person Holger; 06.02.2017
comment
Спасибо. Я не могу обещать, что у меня будет много времени, чтобы изучить это, но еще раз спасибо! - person GhostCat; 27.02.2017