自从我们安装了 Java 1.7.0u45 以来,我们的 WebStart 应用程序在 Windows 系统上的启动出现了很大的延迟(我们还没有尝试过其他平台)。
症状是双击桌面上的应用程序图标后,启动屏幕快速显示,停留一段时间(和以前一样)并关闭。在此之后,我们有大约 1 分钟的延迟。然后,最后,应用程序窗口打开,一切都像魅力一样工作。
我们的应用程序在 Java 1.7.0u25 之前都可以正常工作。Java 1.7.0u40 是出现问题的第一个版本。
我们的应用程序由单个(可执行)jar 文件构成。最令人兴奋的部分是 jar 中用于串行端口访问的一些本机类。我在这篇文章的末尾添加了 jnlp 文件。
我们试图找出延迟的原因可能是什么:
在http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/enhancements-7.html查看我们的版本的 Java WebStart 发行说明。
据我们所知,没有什么可以导致这种行为。我们注意到有新的清单条目(权限、代码库、应用程序名称)。这些被添加了。
看了遍谷歌和stackoverflow。
有些似乎有类似的问题,但我们从未看到解决方案。在许多情况下,人们在下载 jar 文件和重复下载时会遇到问题。这似乎不是我们的问题。
使用坚硬的工具
我们想知道该应用程序在上述时间段内做了什么。所以我们使用了来自 sysinternals 和 wireshark 的进程浏览器和进程监视器。我们发现,在等待期间,进程尝试通过 IP 与“vip1.g-anycast1.cachefly.net”(205.234.175.175)和 93.184.220.29 进行通信。后者似乎是一个证书服务器,我真的不明白那个 cachefly 是什么。在这两种情况下,我们都会看到 TCP 同步,但没有应答,没有进一步的通信。两个地址都可以 ping 通。
与 IP 无关:我们确定应用程序不是下载的,而是从缓存中启动的,并且我们的 main 是在延迟之后调用的,而不是之前。
这就是我们卡住的地方
任何进一步的想法如何解决这个问题?我们是唯一经历这种行为的人吗?
Jnlp(请注意,网址是手动修改的):
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="6.0+" codebase="http://53.48.16.33:8180/jenkins/job/TcuTerm%20-%20Deploy/lastSuccessfulBuild/artifact/5000_Construction/5100_Code_Base/TcuTerm/antlocal" >
<information>
<title>TcuTerm</title>
<vendor>Development</vendor>
<icon href="http://53.48.16.33:8180/jenkins/job/TcuTerm%20-%20Deploy/lastSuccessfulBuild/artifact/5000_Construction/5100_Code_Base/TcuTerm/src/com/x/tcu/app/term/resources/tcu.jpg"/>
<icon kind="shortcut" href="http://53.48.16.33:8180/jenkins/job/TcuTerm%20-%20Deploy/lastSuccessfulBuild/artifact/5000_Construction/5100_Code_Base/TcuTerm/src/com/x/tcu/app/term/resources/tcu.jpg"/>
<icon kind="splash" href="http://53.48.16.33:8180/jenkins/job/TcuTerm%20-%20Deploy/lastSuccessfulBuild/artifact/5000_Construction/5100_Code_Base/TcuTerm/src/com/x/tcu/app/term/resources/splash.jpg"/>
<homepage href="https://confluence.detss.corpintra.net/display/TCU/TcuTerm"/>
<offline-allowed/>
<shortcut>
<desktop/>
<menu submenu="TcuTerm"/>
</shortcut>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="TcuTerm.jar" main="true"/>
</resources>
<application-desc main-class="com.x.tcu.app.term.TcuTerminal"/>
<update check="timeout"/>
</jnlp>