Java Web启动导致执行缓慢
我有一个使用JavaWebStart部署的应用程序。当我进行单元测试时,我注意到一个小问题:每当我的应用程序使用JavaWebStart运行时,一个特定的操作需要很长时间才能执行。但是,当在本地运行时,速度相当快 我所说的特定操作是读取一个大的(5k行)Excel文件来解析它。这是代码行:Java Web启动导致执行缓慢,java,apache-poi,java-web-start,jnlp,Java,Apache Poi,Java Web Start,Jnlp,我有一个使用JavaWebStart部署的应用程序。当我进行单元测试时,我注意到一个小问题:每当我的应用程序使用JavaWebStart运行时,一个特定的操作需要很长时间才能执行。但是,当在本地运行时,速度相当快 我所说的特定操作是读取一个大的(5k行)Excel文件来解析它。这是代码行: Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText()))); 为了解决这个问题,我添加了
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.");
这就是输出:
(本地)
(JavaWebStart)
但是,紧接着的后续运行(在Java Web Start上)会产生以下结果:
Elapsed Time: 1.61 seconds.
我怀疑这与POI库有关(特别是读取POI所需的库的大小,更具体地说,是13MBooxml-schemas-1.0.jar
library文件)。所以,我的问题是:假设是库的大小,有什么方法可以防止这种情况发生吗?我已经通过控制面板打开了库缓存,那么为什么它似乎需要缓存库呢?一旦加载,它就很快了。但第一次要花很长时间
下面是控制面板的图像,显示我允许它存储库:
以前有人见过这种行为吗?没有SSCCE因为。。。那么,如何发布带有Java Web Start问题的SSCCE呢?根据任何结果,您应该仔细检查.jnlp
元素中指定的属性,并将它们与开发环境中的属性进行比较。特别是,请查看影响性能的因素,例如堆大小和VM类型:
…
我发现有两件事帮不上忙。不确定他们是否能解释全部差异,但至少有一些
首先,排队
WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
您有一个非常好的文件对象,现在您正在浪费大量的时间和资源将其缓冲到内存中。正如,如果你有一个文件,直接使用它!切换到以下位置将节省时间和内存:
其次:
poi ooxml需要poi ooxml架构。这是ooxml模式jar的一个小得多的版本。。。较大的ooxml模式jar通常仅用于开发
因此,除非您有一些非常特殊的需求,否则请将完整的
ooxml模式
jar切换到更小的poi ooxml模式
jar,这将涵盖所有常见用例。这将使您的加载速度更快。如果您在jnlp中错误地将download属性设置为lazy,您应该声明您希望立即下载此库
<resources>
<jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>
这意味着它们将在应用程序启动之前被缓存
默认情况下,jar和nativelib资源将被急切地下载,
i、 例如,它们被下载并在本地提供给运行
在应用程序启动之前,先启动应用程序。jar和nativelib
元素还允许将资源指定为惰性。这意味着
资源不必下载到客户端系统
在应用程序启动之前
在中,我遇到了一个类似的问题,但是从文件加载.docx文档(XWPFDocument)时遇到了这个问题。在本地执行此操作时,加载文件的时间不到1秒;然而,通过JavaWebStart完成这项工作对我来说大约需要35秒,对我的同事来说甚至需要半个小时。下面是我如何解决它的,希望它也能解决这个问题 罪魁祸首是ApacheXMLBeans库,或者说它在ApachePOI中的使用方式不正确。ApachePOI发行版中包含的XMLBeans库是2.3.0版,jar文件是XMLBeans-2.3.0.jar。如果您在本地启动程序时将其包含在类路径中,它就可以正常工作。但是,如果您将它作为资源包含在.jnlp文件中,并使用WebStart启动程序,它的工作速度会非常慢,正如您所解释的。如果打开Java控制台并将跟踪级别设置为5,则在加载.docx文件时,程序将查找资源xbean.jar,即使在.jnlp文件中可能没有。这将导致程序查找资源直到超时,并且可能会重试多次,导致加载时间缓慢 有一个关于这方面的错误报告
我通过下载2.5.0版解决了这个问题,我没有包括xmlbeans-2.3.0.jar,而是在类路径中包括了xbean.jar和jsr173_1.0_api.jar,并将其作为.jnlp文件中的资源。True,但没有解释webstart与本地时间的差异。我花了很多时间为这个应用配置POI库。不要问我为什么,但是
poiooxml模式
jar不起作用。整个事情让我很困惑,花了我很长时间才弄明白,但现在它起作用了。但是是的,这个小库不起作用。另外,WorkbookFactory.create(新文件(inputFile.getText())
引发编译器错误,没有用于WorkbookFactory.create(文件文件)
的方法。不知道为什么他们会在他们的文档中包含这些内容??这是我使用FileInputStream
的唯一原因。听起来你使用的是古老版本的POI。升级到最新版本,很可能两者都能正常工作!隐马尔可夫模型。。。确实是POI 3.5,但那是因为我无法让3.9正常工作。圆木钉穿过了方孔,哈哈:)我的j2se标签上写的都是
。我认为我不需要手动调整堆大小。这是一个非常(非常)小、轻量级的应用程序。它只有一个帧。在比较两个环境时,设置之间是否存在差异?不,我没有向命令行添加任何参数或指定任何特定的内容。我在单元测试时开发并运行Netbeans,因此除非我不知道Netbeansrun
与命令行javamyjar.jar
…使用javaws
,否则启动.jnlp
WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
WorkbookFactory.create(new File(inputFile.getText()));
<resources>
<jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>