Нужен ли нам Unsafe в Java?

«Безопасность превыше всего!» Такой лозунг хорошо подошёл бы Java-платформе, ведь виртуальная машина обеспечивает верификацию байткода, автоматическое управление памятью и ловит типичные ошибки вроде нулевых указателей и выхода за пределы массива. Java API тщательно разрабатывается с учётом требований безопасности и контроля доступа.

Но последнее время всё больше и больше разработчиков хотят обойти ограничения и выбраться из «песочницы» JVM. Едва ли кто из опытных программистов никогда не слышал про sun.misc.Unsafe. Хотя этот класс всегда был частью внутреннего API, не предназначенного для публичного использования, за последние годы его популярность настолько выросла, что сейчас наличие Unsafe стало практически показателем «крутости» open source проектов. Не исключение и Одноклассники: программное обеспечение социальной сети во многом основывается на приватных API.

Что же такого привлекательного в Unsafe? Почему программисты фанатично внедряют его в свои проекты, пренебрегая всеми предупреждениями? Отчего поднялась волна паники от слухов, что в Java 9, наконец-таки, Unsafe прикроют? Есть ли безопасные альтернативы приватным классам, или без Unsafe нет в жизни счастья?

Ответам на эти вопросам и посвящён доклад. Мы разберём типичные сценарии использования Unsafe, узнаем, какими ещё приватными API не брезгуют в Одноклассниках, и, главное, ради чего. Хорошенько подкрепим теорию бенчмарками и примерами из реальных проектов.


Андрей Паньгин 

Ведущий разработчик в Mail.Ru Group. Желая сделать платформу Одноклассников максимально быстрой и надёжной, Андрей выжимает буквально каждый такт из производительности серверов на Java. Порой для этого приходится искать баги в JVM и даже патчить OpenJDK, в чём ему помогает опыт работы в Sun Microsystems над виртуальной машиной HotSpot.

Андрей известен своим интересом к ассемблеру, устройству JVM и недокументированным API, что нашло отражение в его докладах про внутренности JDK. Автор проекта «one-nio» — открытого фреймворка для разработки высоконагруженных серверов на Java.