JavaOne 2013

Apr 25, 2013 13:46


23 и 24 апреля в Москве проходила конференция JavaOne, которую я посетил. И хотя не в моей привычке что-либо писать в блог, я всё же решил, что будет уместнее опубликовать эту запись один раз, чтобы при необходимости хвастаться достаточно было кинуть ссылку.

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

Итак, на keynote я не попал. Попал на первую серию докладов, из которой я выбрал "Файберы. Лёгкие потоки на Java" Сергей Загурского из mail.ru. Хотелось так же посетить "Борьба с паузами GC", но я всё же выбрал доклад про файберы в силу того, что посчитал эту тему сильно похожей на то, что я делаю. И я не ошибся. Дело в том, что для описания бизнес-процессов в одном проекте, над которым я работаю, я решил использовать javaflow, чтобы иметь возможность приостановить workflow, пока он ожидает реакции от пользователя. Собственно, про что-то подобное javaflow я и ожидал услышать, так оно и вышло.

Сергей Загурский руководит командой, работающей на серверной логикой SkyForge. Там одной стороны приходится обрабатывать большое количество различных объектов, а с другой стороны, нужно обеспечить взаимодействие между объёктом и какими-то внутренними сервисами. Делать всё в async-стиле, понятное дело, не хотелось, а вот RPC приводит к порождению кучи потоков со всеми вытекающими последствиями. В общем, они взяли те же continuations и использовали их, чтобы организовать легковесные потоки, aka fiber'ы. Оказалось, что javaflow они не используют (но знают про него), а написали свою библиотеку. Как сказал Сергей, помимо того, что разработка javaflow идёт достаточно медленно, библиотека ещё и медленно работает. Но вообще, это не совсем так. Просто javaflow достаточно медленно сохраняет и восстанавливает состояние, а в штатном режиме накладных расходов практически нет. Механизм из проекта SkyForge, наоборот, даёт заметные накладные расходы при исполнении, но на сохранение/восстановление почти ничего не затрачивает. Полагаю, в их случае это более оправданное поведение, т.к. нужно постоянно посылать RPC-запросы, а вот в моём случае время сохранения не так уж важно, потому что не так уж часто за время своего исполнения workflow что-то спрашивает у пользователя. К тому же, состояние workflow с достаточно большой вероятностью будет сериализовано и попадёт в БД.

Второй доклад назывался "Тестирование с использованием инструментирования байт-кода". Автор - Владислав Пономарёв из IBM - рассказал о том, что в процессе тестирования бывает нужно от некоторой используемой библиотеки получить определённое поведение, но это поведение достаточно сложно вызвать. Такое может быть в силу ряда причин - очень сложная логика вызываемого метода, сложно вызываемые исключения (например, java.lang.OutOfMemoryError). Для того, чтобы нужное поведение воспроизвести, Владислав предлагал изменить байт-код вызываемого метода так, чтобы он вёл себя так, как нужно. Для изменения предлагалось использовать java.lang.instrument и ASM. Про них я ничего нового не узнал, так что практическая часть доклада была мне не интересна. Разумеется, сразу же возник вопрос - а почему бы не вызывать библиотечный код через интерфейс, а в тесте не написать stub или mock? Докладчик сказал, что иногда такое бывает в legacy-коде или при необходимости использовать библиотеки с кривым дизайном. Ну что же, я ему верю, но это крайне редкая ситуация, так что доклад был не очень полезен с практической стороны, но был интересен в плане "о, ещё и так можно сделать".

Потом последовал доклад Владимира Иванова (Oracle) "Invokedynamic: роскошь или необходимость". Владимир работает над JIT-компилятором в HotSpot. Из его доклада я плохо понял, что такое Invokedynamic. Он пошёл таким галопом по Европам, что человеку неподготовленному было сложно что-либо понять, а подготовленный и так знает, что такое Invokedynamic. Уже потом я почитал про ID в Интернете и для себя составил следующую картину. Когда инструкция invokedynamic выполняется в первый раз, JVM выполняет некоторый (зависящий, как я понял, от той страшной записи в constant pool'е) boostrap-метод. Bootstrap-метод - это обычный java-метод, который принимает на вход CallSite (последний, разумеется, формируется JVM) и генерирует MethodHandler, и invokedynamic преобразуется в вызов этого самого MethodHandler'а (разумеется, байт-код никто не меняет, все преобразования идут где-то на уровне JIT).

Четвёртый доклад, под названием "JDK8: Я, лямбда", читал Сергей Куксенко из Oracle. Читал его он в популярной форме, с шутками, чтобы даже самые маленькие поняли всё про лямбду. Чего-то существенно нового я не узнал, что такое лямбда и какой она будет в Java, я уже был в курсе. Прояснились лишь кое-какие детали. Но главное, что удалось почерпнуть из доклада, - это реализация лямбд. Оказывается, есть спецификация на эту тему, и она утверждает, что лямбду необходимо компилировать в метод в том же классе, а оборачивать в объект - с помощью некоторой мифической lambda factory, природа которой может быль любой. В частности, пока речь идёт о сгенерированном анонимном классе, но в будущем ничто не должно препятствовать переходу на invokedynamic.

Последним посещённым в первый день докладом был "Building Modular Enterprise Applications in the Cloud Age" неких Berk Ertman и Paul Bakker. Честно говоря, зря я пошёл на этот доклад, потому что в итоге не понял, что до меня хотели донести. Возможно потому, что я пропустил первую часть доклада. Рассказчики рекламировали свою облачную платформу, где можно запускать OSGi-бандлы в их настроенном облачном окружении. Потом показывали, как писать приложение в OSGi-среде, и теоретически такое приложение должно было исполняться у них в облаке. При этом я не увидел каких-либо преимуществ перед другими известными мне технологиями вроде Spring или maven, которые решают львиную долю проблем, решаемых OSGi. В общем, у меня после доклада был обильный холивар с коллегами на эту тему. Ну и ещё они ужасно быстро тараторили, а я не настолько хорошо воспринимаю на слух английский язык.

Вероятно, о втором дне на JavaOne я напишу в следующий раз.

javaone

Previous post Next post
Up