Когда Java читает метод bytecode? - PullRequest
0 голосов
/ 27 апреля 2018

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

Для цитирования, задокументировано ли это поведение где-нибудь?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Для цитирования, задокументировано ли это поведение где-нибудь?

Да, это так. См. Javadoc для Instrumentation.redefineClasses :

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

0 голосов
/ 27 апреля 2018

Отдельный не ответ: лучше так и будет.

Видите ли, обмен кода метода при выполнении этого кода наиболее вероятно , что приводит к несоответствиям.

Что если в вашей старой версии 4 инструкции (например, 4 назначения), а в новой - 3 совершенно разных назначения. Теперь происходит 2 из 4 назначений, а затем код поменялся местами. И что теперь?

Вся идея таких действий hot swap заключается в том, чтобы не создавать противоречивое поведение. Ваша идея замены кода, который в настоящее время выполняется, является хорошим рецептом для быстрого устранения несоответствий.

...