java - 每次 Java 更新时,web start jar 验证都会变慢

标签 java performance java-web-start

我们有一个 90MB 的 (Eclipse RCP) 应用程序,包含 139 个自签名 jar,在没有 Web Start 的情况下启动需要 8 秒,而在旧版本的 Java 7 中启动需要 10 秒。我们将 Java 配置为不使用浏览器代理,即 deployment.proxy.type=0

随着每次更新,Oracle 的 Java 启动性能都会下降。完全启动需要越来越多的时间:

  • 7u60/7u65/8u25:13 秒(网络启动处理 5 秒后启动)
  • 7u75:23秒
  • 8u31:20秒
  • 8u40:29秒
  • 8u51/8u60ea:32秒

我该如何解决这个问题?

从跟踪/日志中我可以看到,这种速度下降很可能完全是由于验证缓存的 jar 花费了更多时间。请注意this question类似,但未提供以下详细信息:

诊断:

  • 缓存后,更新检查仅在 0.5 秒内运行(服务器返回“304 Not 已修改”),但即使完全下载,在千兆位网络上也只需要几秒钟。
  • 更新检查后,每个 jar XXX 都会有一个日志条目:

validating cached jar XXX.jar

完成后,com.sun.javaws.Main 启动,之后似乎会再次发生相同的验证并花费大约相同的时间,然后应用程序启动。

  • 验证缓存的 jar 所花费的时间似乎对应于 应用程序启动之前所需的额外时间。
  • 网络启动启动画面始终显示约 2 秒,与更新检查相对应,然后隐藏。大约 20 秒后,Java 控制台终于出现,我的应用程序实际启动。
  • 在延迟期间,jp2launcher.exe 在具有超线程功能的四核(8 个逻辑核心)上使用了大约 16% 的处理器时间。因此看起来它完全使用了其中一个逻辑处理器。

我已经尝试过但没有任何区别:

  • 清除网络启动缓存(无数次)
  • 配置deployment.properties以禁用证书吊销检查(以及blacklist.check和validation.ocsp、validation.crl)
  • 离线运行
  • 使用版本下载协议(protocol)
  • 添加到网站异常(exception)列表
  • 检查网络服务器日志是否存在问题。未找到任何内容,所有 138 个 jar 的更新检查运行时间约为 500 毫秒。
  • 使用其他网络服务器
  • 已检查证书到期日期为 2016 年 2 月 17 日
  • 使用 JaNela 验证了我的 jnlp,没有发现严重问题
  • 创建部署规则集以允许应用程序在未签名的情况下运行,以加快验证速度。这应该是可能的,并且看起来是解决这个问题的一种有前途的方法,但我无法让它发挥作用。另见我的回答on this post .
  • 将 Java 配置为“不启动控制台”

详细信息:7u60 上的一些奇怪行为 在 7u60 中,应用程序在大约 5 秒后启动,之后 Java 控制台似乎在后台执行 jar 验证,而应用程序已经启动。然而,.log 文件报告应用程序在所有验证完成后启动。它将报告为 25 秒,然后显示我的应用程序的第一个 System.out,实际上仅在 5 秒左右后发生。它还显示与服务器进行 jar 更新检查所花费的时间是服务器报告的时间的 10 倍。所以我猜这是日志框架落后的问题!在 8u51 上没见过这个。

最佳答案

本身还不是答案,但我发现 Java 8u25 在启用跟踪时仅生成一个跟踪文件。 8u51 生成两个文件,一个来自 JVM,用于更新应用程序,另一个用于运行应用程序。这是新的(两个 JVM 启动),我认为与使用 native Windows 沙箱功能的新设置有关。问题是它不必在第二个 JVM 上再次验证签名。无论是否禁用使用 native 沙箱的设置(默认),两个 JVM 实例上的分离总是会发生。

我报告了一个回归错误,如果我从 Oracle 得到答案,我将编辑答案。

注意:Java 8u31 仍然在一个 JVM 上运行所有内容,但启动时间与问题所述相同,增加了一倍。

关于java - 每次 Java 更新时,web start jar 验证都会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31568627/

相关文章:

java - 为什么为 Java 的 Hibernate 库选择名称 "Hibernate"?

java - Jboss 托管服务器在部署之间停止

java - Foreach 参数性能

javascript - 从 javascript 调用时,jnlp 文件中的 URL 编码不正确

Java Webstart 应用程序 - 从单独的文件加载属性

java - Android JSON 性能问题

Java Rest @GET 可以工作,但 @DELETE 和 @POST 路径不会被命中

c# - 调试版本和发布版本之间的性能差异

python - 计算满足谓词的序列元素的最快方法

java - JNLP文件自动更新问题