【发布时间】: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