【问题标题】:web start jar validation getting slower with each Java update每次 Java 更新时,web start jar 验证都会变慢
【发布时间】:2015-07-22 16:15:48
【问题描述】:

我们有一个 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:20s
  • 8u40:29s
  • 8u51/8u60ea:32s

我能做些什么来解决这个问题?

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

诊断:

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

验证缓存的 jar XXX.jar

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

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

我已经尝试过但没有任何改变:

  • 清除网页启动缓存(无数次)
  • 配置 deployment.properties 以禁用证书吊销检查(以及 blacklist.check 和 validation.ocsp、validation.crl)
  • 离线运行
  • 使用版本下载协议
  • 添加到站点例外列表
  • 检查 Web 服务器日志是否存在问题。未找到,所有 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 上没见过这个。

【问题讨论】:

  • 当我在所有 jar 上运行“jarsigner -verify”时,即使使用 7u60,也需要大约 30 秒。原则上不能由此得出任何结论,这一次包括为每个 jar 启动一个新的 jarsigner 进程的开销。但这确实让我相信验证 jars 总是很慢(就像对它们签名一样),并且旧的 Java Web Start 版本有一些在新版本中被删除的优化。也许他们缓存了验证结果,或者他们在加载 jar 时懒惰地验证了它们,而不是急切地验证它们。
  • 我决定实现自己的“局域网启动”机制。事实上,它只是一个简短的批处理脚本,如果客户端和服务器上的 version.properties 文件不匹配,它会通过本地网络共享复制客户端,然后启动应用程序。非常简单而且非常快,但当然只适用于本地网络。

标签: java performance java-web-start


【解决方案1】:

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

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

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

【讨论】:

  • 确实我发现7u60/8u25似乎通过同一个javaws.exe进程在同一个JVM中运行应用程序。更高版本通过单独的 jp2launcher.exe 进程启动它。这已经发生在 7u65 中,不会出现性能问题。 jp2launcher 确实可以解释为什么我看到罐子被验证了两次。即使这会影响性能,也无法解释从 13 秒到 32 秒的下降:使用 7u60,Web 启动在 8 秒之上需要额外的 5 秒来启动应用程序,因此它最多应该导致 2 * 5 秒 + 8 秒 = 18 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2023-03-24
  • 2012-01-08
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多