每次Java更新时,Web启动jar验证都会变慢

时间:2015-07-22 16:15:49

标签: java performance java-web-start

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

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

  • 7u60 / 7u65 / 8u25:13s(网页开始处理5s后开始)
  • 7u75:23s
  • 8u31:20s
  • 8u40:29s
  • 8u51 / 8u60ea:32s

我该怎么做才能解决这个问题?

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

诊断:

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

验证缓存的jar XXX.jar

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

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

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

  • 清除网络启动缓存(无数次)
  • 配置deployment.properties以禁用证书吊销检查(以及blacklist.check和validation.ocsp,validation.crl)
  • 离线运行
  • 使用版本下载协议
  • 添加到网站例外列表
  • 检查Web服务器日志是否存在问题。没有找到,所有138个罐子的更新检查大约需要500毫秒。
  • 使用其他网络服务器
  • 检查证书到期日2016年2月17日
  • 使用JaNela验证了我的jnlp并发现没有严重问题
  • 创建部署规则集以允许应用程序运行unsigned以加快验证速度。这应该是可能的,看起来像一个有希望的解决方法,但我无法让它工作。另请参阅我的回答on this post
  • 将Java配置为"不启动控制台"

详情:7u60上的一些奇怪行为 在7u60中,应用程序在大约5秒后启动,之后Java控制台将在应用程序启动时在后台执行jar验证。但是.log文件报告在完成所有验证后应用程序启动。它将此报告为25秒,然后显示我的应用程序的第一个System.out,它实际上仅在5秒钟后发生。它还显示服务器的jar更新检查时间是服务器报告的10倍。所以我想这是日志框架滞后的问题! Haven没有在8u51上看过这个。

1 个答案:

答案 0 :(得分:0)

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

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

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