每次Java更新时,web启动jarvalidation都会变慢
我们有一个90MB的(Eclipse RCP)应用程序,带有139个自签名jar,在没有Web Start的情况下从8s开始,在Java7的旧版本中以10s开始。我们将Java配置为不使用浏览器代理,即deployment.proxy.type = 0 。
随着每次更新Oracle的Java启动性能下降。 完全启动需要花费越来越多的时间:
- 7u60 / 7u65 / 8u25:13s(网络启动处理5s后开始)
- 7u75:23s
- 8u31:20s
- 8u40:29s
- 8u51 / 8u60ea:32s
我该怎么做才能解决这个问题?
从跟踪/日志中我可以看到,这种减速很可能完全是由于validation缓存的jar需要更多时间。 请注意, 此问题类似,但未提供以下详细信息:
诊断:
- 缓存时,更新检查仅运行0.5秒(服务器返回“304 Not Modified”),但即使完全下载,千兆网络也只需几秒钟。
- 更新检查后,每个jar XXX都有一个日志条目:
validation缓存的jar XXX.jar
完成后,启动com.sun.javaws.Main,之后相同的validation似乎再次发生并花费大约相同的时间,然后应用程序启动。
- validation缓存jar所花费的时间似乎与应用程序启动前所需的额外时间相对应。
- Web启动启动屏幕始终显示与更新检查相对应的约2秒,然后隐藏。 几乎20秒后,Java控制台终于出现,我的应用程序实际启动了。
- 在延迟期间,jp2launcher.exe在具有超线程(8个逻辑核心)的四核上使用大约16%的处理器时间。 所以看起来它完全使用了一个逻辑处理器。
我已经尝试但没有任何区别:
- 清除Web启动缓存(无数次)
- 配置deployment.properties以禁用证书吊销检查(以及blacklist.check和validation.ocsp,validation.crl)
- 离线运行
- 使用版本下载协议
- 添加到站点例外列表
- 检查Web服务器日志中的问题。 没有找到,所有138个jar子的更新检查大约500毫秒。
- 使用另一个Web服务器
- 检查证书到期日2016年2月17日
- 用JaNelavalidation了我的jnlp,发现没有严重的问题
- 创建部署规则集以允许应用程序运行未签名以加快validation。 这应该是可能的,看起来像是一种很有前途的方法来解决这个问题,但我无法让它发挥作用。 另见我对这篇文章的回答。
- 将Java配置为“不启动控制台”
细节:7u60上的一些奇怪的行为在7u60中,应用程序在大约5秒后启动,之后Java控制台APPEARS在应用程序启动时在后台进行jarvalidation。 但是.log文件报告在完成所有validation后应用程序启动。 它将此报告为25秒,然后显示我的应用程序的第一个System.out,它实际上仅在5秒钟后发生。 它还显示服务器的jar更新检查时间是服务器报告的10倍。 所以我想这是日志框架滞后的问题! 在8u51上没见过这个。
本身不是答案(但是),但我发现启用跟踪时Java 8u25只生成一个跟踪文件。 8u51生成两个文件,一个来自用于更新应用程序的JVM,另一个用于运行它。 这是新的(两个JVM初创公司),我认为这与使用本机Windows沙箱function的新设置有关。 问题是它不应该在第二个JVM上再次validation签名。 无论是否禁用使用本机沙箱的设置(默认设置),都会发生两个JVM实例的分离。
我报告了一个回归错误,如果我从Oracle得到答案,我会编辑答案。
注意:Java 8u31仍然可以在一个JVM上运行所有内容,但问题所述的启动时间相同。