Skip to content

JEP 232: Improve Secure Application Performance | 提高安全应用程序性能

摘要

改善安装了安全管理器的应用程序的性能。

目标

了解性能问题并实施改进,以提高性能。将创建子任务来评估和跟踪每个潜在的改进。

非目标

改进性能是一个可取的结果,但此 JEP 不会承诺性能将通过哪些具体指标来提高。

动机

许多使用 Java SE、Java EE 和相关技术的开发人员要求改进安装了安全管理器的应用程序的性能。虽然具体的数据尚未确认,并且可能因多种因素而有所变化,但已知启用安全管理器运行 Java 应用程序会导致 10-15% 的性能下降。尽管无法避免一些性能损失,但缩小此性能差距既有性能又有安全益处。

描述

我们研究并实施了许多优化和增强措施,以改善安装了安全管理器的应用程序的性能。其中一些优化改进了性能,而其他一些则没有。还有一些显示出潜力,但由于各种原因不会作为这个 JEP 的一部分集成进来。对于每个考虑的优化,我们打开了新的 JBS 问题(如果之前不存在),并使用 JMH 创建了微基准测试。

优化

根据测试和社区反馈,我们主要关注的性能改进领域是安全策略的执行和权限的评估。权限类和默认 JDK 策略实现设计为线程安全。然而,使用多个线程进行性能测试显示这些类是热点。我们实施了几项改进,提高了吞吐量并减少了线程争用:

  1. 使用 ConcurrentHashMap 将 ProtectionDomain 映射到 PermissionCollection
  2. SecureClassLoader 应该使用 ConcurrentHashMap
  3. 删除在 identityPolicyEntries 列表上同步的策略提供程序代码
  4. 在 Permissions 类中,将 PermissionCollection 条目存储在 ConcurrentHashMap 而不是 HashMap 中
  5. 在 PermissionCollection 子类中使用并发集合来存储权限

我们还在两个其他关键领域改进了性能:

  • 我们更改了 java.security.CodeSourcehashCode 方法,避免使用 codesource URL 的字符串形式进行昂贵的 DNS 查找来计算散列码。有关更多信息,请参见 JDK-6826789

  • 我们增强了 java.lang.SecurityManagercheckPackageAccess 方法的包检查算法。有关更多信息,请参见 JDK-8072692

测试

需要进行测试以测量在应用每个潜在优化之前和之后的性能。可能需要实施多个测试来确保适当的代码覆盖率,并反映不同类型的用例。使用性能分析工具将有助于确定潜在优化领域。此外,我们将运行 SPECjEnterprise 基准测试,以衡量优化对 Java EE 应用程序的性能影响。

最后,将在所有支持的 JDK 平台上对每个优化进行测量,以确保结果始终是积极的。