понимаю, что когда мы в первый раз вызываем лямбду то для нее в хипе генерируется объект CallSite со статическим методом, а потом просто вызывается этот метод?
Эх, @Tagir_Valeev 100% знает, но его почему то тут нет(
щас бы Тагира дергать на такого уровня вопросы как кодировку менять , а дальше что - как шрифты менять ? )
оу оу, посмотри на что я реплаил)
вообще есть, и даже отвечает
Да, даже если и шрифты. В падлу ответить что ли?
хм, проверил по списку юзеров - да, есть. Но когда в сообщении набираешь его ник то никого не находит
потому что я смотрю stackoverflow и вижу такое сообщение: В первом случае, лямбда-выражения просто превращаются в статический метод, имеющий точно такую же сигнатуру лямбда-выражения, и объявляются в том же классе, где используется лямбда-выражение. Например, лямбда-выражение, объявленное в классе Lambda выше, может быть преобразовано в метод, подобный этому И немного путаюсь. Зачем тогда CallSite объект нужен?
хм, читая статью возник вопрос. В самом первом примере кода создается метод в котором находится логика лямбды, и используется CallSite объект чтобы этот метод вызвать. Зачем использовать CallSite объект, если такой метод уже создан, и мы можем просто вызвать его?
A CallSite is a holder for a variable MethodHandle, which is called its target. An invokedynamic instruction linked to a CallSite delegates all calls to the site's current target. A CallSite may be associated with several invokedynamic instructions, or it may be "free floating", associated with none. In any case, it may be invoked through an associated method handle called its dynamic invoker.
Потому что в общем виде целевой MethodHandle (MH) можно положить в MutableCallSite и менять его на лету, давая рантайму переоптимизировать. Для лямбд это не важно, потому что целевой MH там лежит в ConstantCallSite (CCS). JIT-компилятор, увидя слинкованный CCS, тупо найдёт там целевой MH, и заинлайнит сквозь него.
Нет, инстанс метод. Лямбда же интерфейс реализует. Вот соответствующий метод этого интерфейса
CallSite - это просто ссылка на метод хэндл. В lambda metafactory используются только ConstantCallSite. Если лямбда не имеет состояния, то создаётся один константный объект анонимного класса и создаётся константный метод хэндл, типа геттера, который всегда возвращает этот самый объект
Можно спросить а вам это зачем? Праздное любопытство или на работе у вас периодически задачи сверхоптимизаций возникают? Такие что нужно понимать где как джит оптимизирует, где интринсики работают, а где программист должен особым образом писать Т.е. кажется это нужно либо в hft либо при разработке чего-то движкового типа спарка или netty
да нет, конечно для расширения кругозора
Обсуждают сегодня