JEP 232: Improve Secure Application Performance
Повышение производительности защищённых приложений
| Ответственный | Sean Mullan |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 9 |
| Компонент | security-libs / java.security |
| Обсуждение | security dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | L |
| Рецензенты | Brian Goetz |
| Одобрен | Brian Goetz |
| Создан | 2014/05/21 12:57 |
| Обновлён | 2017/03/10 16:07 |
| Задача | 8043631 |
Аннотация
Повысить производительность приложений, которые работают с установленным security manager.
Цели
Лучше разобраться в проблемах производительности и реализовать улучшения, которые на деле повышают производительность. Для оценки и отслеживания каждого возможного улучшения будут созданы подзадачи.
Что не является целью
Повышение производительности — желаемый результат, но этот JEP не берёт на себя обязательств по каким-либо конкретным показателям, на которые улучшится производительность.
Мотивация
Многие разработчики, использующие Java SE, Java EE и связанные с ними технологии, просили повысить производительность приложений, работающих с security manager. Точные цифры не подтверждены и могут зависеть от ряда факторов, но известно, что запуск Java-приложения с включённым security manager снижает производительность на 10–15 %. Некоторое снижение производительности неизбежно, однако сокращение этого разрыва даёт выигрыш и в производительности, и в безопасности.
Описание
Мы исследовали и реализовали ряд оптимизаций и улучшений для повышения производительности приложений, которые работают с установленным security manager. Одни оптимизации повысили производительность, другие нет. Несколько оптимизаций показали себя перспективными, но по разным причинам не будут интегрированы в рамках этого JEP. Для каждой рассмотренной оптимизации была открыта новая задача в JBS (если её ещё не было), и с помощью JMH были созданы микробенчмарки.
Оптимизации
По результатам тестирования и отзывам сообщества основным направлением работы по повышению производительности мы выбрали применение политики безопасности и проверку разрешений. Классы разрешений и реализация политики JDK по умолчанию спроектированы потокобезопасными. Однако тесты производительности с несколькими потоками показывают, что эти классы — узкое место. Мы реализовали несколько улучшений, которые повышают пропускную способность и снижают конкуренцию потоков:
- Использовать ConcurrentHashMap для сопоставления ProtectionDomain и PermissionCollection
- SecureClassLoader должен использовать ConcurrentHashMap
- Удалить код провайдера Policy, который синхронизируется на списке identityPolicyEntries
- Хранить записи PermissionCollection в классе Permissions в ConcurrentHashMap вместо HashMap
- Хранить разрешения в подклассах PermissionCollection в конкурентных коллекциях
Мы также повысили производительность ещё в двух ключевых областях:
-
Мы изменили метод
hashCodeклассаjava.security.CodeSourceтак, чтобы он вычислял хэш-код по строковой форме URL источника кода и не выполнял потенциально затратные DNS-запросы. Подробнее см. JDK-6826789. -
Мы улучшили алгоритм проверки пакетов в методе
checkPackageAccessклассаjava.lang.SecurityManager. Подробнее см. JDK-8072692.
Тестирование
Понадобятся тесты, измеряющие производительность до и после применения каждой возможной оптимизации. Чтобы обеспечить должное покрытие кода и отразить разные сценарии использования, может потребоваться реализовать больше одного теста. Для поиска мест, где возможна оптимизация, будут использоваться профилировщики. Кроме того, мы запустим бенчмарк SPECjEnterprise, чтобы измерить влияние оптимизаций на производительность приложений Java EE.
Наконец, каждая оптимизация будет измерена на всех поддерживаемых платформах JDK, чтобы убедиться, что результаты стабильно положительные.