当前位置: 首页 > 知识库问答 >
问题:

JavaWeb启动导致执行缓慢

田易安
2023-03-14

我有一个使用Java Web Start部署的应用程序。当我进行单元测试时,我注意到一个小问题:每当我的应用程序使用Java Web Start运行时,一个特定的操作都需要很长时间才能执行。然而,当在本地运行时,速度相当快。

我所说的特定操作是读取一个大的(5k行)Excel文件来解析它。这是代码行:

Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));

为了解决这个问题,我添加了一种记录时间的方法:

long time1 = System.currentTimeMillis();
Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
long time2 = System.currentTimeMillis();
long diff = time2 - time1;
double seconds = (double)diff / (double)1000;
DecimalFormat df = new DecimalFormat("#,##0.00");
System.out.println("Elapsed Time: " + df.format(seconds) + " seconds.");

这是输出:

(本地)

Elapsed Time: 4.83 seconds.

(Java Web Start)

Elapsed Time: 35.52 seconds.

但是,随后立即运行(在JavaWeb Start上)会产生以下结果:

Elapsed Time: 1.61 seconds.

我怀疑这与POI库有关(尤其是读取POI所需的库的大小,更具体地说,是13MB的ooxml-schemas-1.0.jar库文件)。所以,我的问题是:假设是库的大小,有什么方法可以防止这种情况?我通过控制面板打开了库缓存,那么为什么它似乎需要缓存库呢?一旦加载,速度就很快。但第一次就要花很长时间。

以前有人见过这种行为吗?没有SSCCE,因为。。。那么,如何发布带有Java Web Start问题的SSCCE?

共有3个答案

关玄裳
2023-03-14

如果您在jnlp中错误地将download属性设置为lazy,那么您应该声明希望立即下载这个库

<resources>
        <jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>

这意味着它们将在应用程序启动之前被缓存

默认情况下,jar和nativelib资源将被急切下载,即在启动应用程序之前,它们被下载并在本地提供给运行应用程序的JVM。jar和nativelib元素还允许将资源指定为惰性。这意味着在启动应用程序之前不必将资源下载到客户端系统上。

从http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.html

芮瑾瑜
2023-03-14

我可以看到两件事不会有帮助。不确定他们是否能解释全部差异,但至少有一些。。。

首先,线路

WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));

您有一个非常好的文件对象,现在您正在浪费大量的时间和资源将其缓冲到内存中。正如POI文档中非常清楚地解释的那样,如果您有一个文件,请直接使用它!您将节省时间和内存(如文档所示)切换到:

WorkbookFactory.create(new File(inputFile.getText()));

.

其次,从POI组件页面:

poi-ooxml需要poi-ooxml模式。这是ooxml-Schemas jar的一个小得多的版本...较大的ooxml-Schemas jar通常仅用于开发

因此,除非您有一些非常特殊的需求,否则请将完整的ooxml模式转换为更小的poi ooxml模式jar,这将涵盖所有常见用例。这也会让你的装载速度更快。

鞠泰平
2023-03-14

根据任何分析结果,您应该仔细检查<代码>

<resources>
    <j2se
        version="1.6+"
        initial-heap-size="128m"
        max-heap-size="256m"
        java-vm-args="-server"/>
    …
</resources>
 类似资料:
  • 我是docker新手。我想在docker中部署我的应用程序节点js,但我面临以下错误,请帮助我 /usr/bin/docker-current:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致“在$PATH中找不到exec: \".\": 可执行文件”。 Dockerfile:

  • 我正在将程序从JApplet迁移到Java Web Start,我遇到了安全问题。我的程序是用我公司的证书签署的,我还将我的网站添加到Java控制面板的例外列表中,但它仍然给我这个错误: 我的Java例外网站列表: 我的JNLP文件如下所示: 我使用java 1.8。0_73。Jar文件由正确签名。你知道如何在没有这个错误的情况下用网络启动应用程序吗?HTTP服务器在我的本地电脑上。当我用JNLP

  • 错误:无法启动服务cpanel_客户端:头字段值无效“oci运行时错误:容器_linux.go:247:启动容器进程导致”exec:\“sudo\”:未找到可执行文件 这是我的docker文件, 这是码头工人。yml, 我的package.json档案, 建造成功了。当我运行时,我遇到了这个错误。有人能告诉我哪里错了吗?

  • 问题内容: 我收到一个错误,但我不明白是什么原因引起的。 这是生成错误的代码片段: 这是我的文件: 上面的代码导致 ,但是我不明白我正在访问什么空指针,因为我没有使用任何不安全的构造。完整的错误如下: 我该如何解决? 谢谢 问题答案: 您必须先致电才能注册。

  • 从我创建项目开始,这就非常有效。但突然间开始崩溃。注册活动工作正常。但是这个登录活动正在崩溃。 Firebase 身份验证导致 Android 致命异常 这听起来和我的问题很相似,但我还是不明白为什么会这样。

  • 我是docker的新手。我正在尝试使用docker-compose将我的Go应用程序容器化。技术使用Golang、Docker 20.10.8和Air(用于实时重新加载)。我的Dockerfile看起来像这样。 我的docker撰写。yml就是这个。 在运行命令sudo docker-compose up-d时,我收到以下错误 来自守护进程的错误响应:OCI运行时创建失败:container_li