在 Java 7 上性能降低

AEM 在 Java 7 上性能突然降低,线程转储不显示原因线程的任何证据;许多线程处于可运行状态且执行的代码部分已知没有任何缺陷。

此问题的根本原因是 Java 7 遇到了堆栈溢出问答中描述的 CodeCache 问题。

总而言之,“在 Java 7 中,CodeCache 一满,JIT 就会停止,几乎 1/3 的 CodeCache 区都会刷新,但 JIT 未重新启用。”

这种情况会导致 Java 代码的执行速度显著变慢,从而退出代码缓存区或 JVM 从不执行代码。因此,仅命中 JIT 编译代码的某些请求将仍以正常响应时间响应,而其他请求则可能需要较长时间。

解决方案:升级 Java 版本,或禁用代码缓存区刷新

下面提供了三个解决方案:

  • 升级到不受此性能问题影响的 Java 8。这是最安全的解决方案。
  • 升级到要求获得 Oracle Java SE 支持的 Java 1.7.0_101-b14,因为 Java 7 已于 2015 年 5 月停产
  • 禁用代码缓存区刷新,并将以下 JVM 参数添加到 AEM 启动脚本以增加缓存大小: 
    • -XX:-UseCodeCacheFlushing
    • -XX:ReservedCodeCacheSize=90M

这些参数将代码缓存区大小指定为 90 MB(而非默认的 48 MB),并禁用代码缓存区刷新,这样一来,如果代码缓存区溢出,现有热代码不会在解释器模式下运行(只是不再编译新代码)。监视代码缓存区大小一段时间(例如使用 jconsole)以确保配置的最大值不会过低。请注意,升级到 Java 8 后,必须删除这些设置。

 

本产品经 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 许可  Twitter™ 与 Facebook 中的内容不在 Creative Commons 的条款约束之下。

法律声明   |   在线隐私策略