跳到主要内容

JEP 232:提高安全应用程序性能

概括

提高在安装了安全管理器的情况下运行的应用程序的性能。

目标

更好地了解性能问题并实施经证明可提高性能的增强功能。将创建子任务来评估和跟踪每个潜在的改进。

非目标

提高绩效是一个理想的结果,但本 JEP 不会承诺提高绩效的任何具体指标。

动机

许多使用 Java SE、Java EE 和相关技术的开发人员都要求提高使用安全管理器运行的应用程序的性能。尽管具体数字尚未确认,并且可能会因多种因素而异,但运行启用安全管理器的 Java 应用程序已知会导致 10-15% 的性能下降。尽管一些性能损失是不可避免的,但缩小这种性能差距既有性能优势又有安全优势。

描述

我们探索并实施了许多优化和增强功能,以提高安装了安全管理器的应用程序的性能。其中一些优化提高了性能,而另一些则没有。其他一些项目也被证明有希望,但由于各种原因不会被集成到本 JEP 中。对于所考虑的每个优化都打开了新的 JBS 问题(如果以前不存在),并使用JMH创建了微基准。

优化

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

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

我们还提高了其他两个关键领域的性能:

  • 我们更改了hashCode方法,java.security.CodeSource通过使用代码源 URL 的字符串形式来计算哈希码,以避免可能昂贵的 DNS 查找。有关更多信息,请参阅JDK-6826789 。

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

测试

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

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