Java Webstart应用程序的内存分配

6
我正在使用一个名为BLAST2GO的Java WebStart应用程序,遇到了内存分配的问题。它需要将大量数据集加载到内存中,因此我一直在尝试为这个应用程序分配3-6GB的内存。然而,无论我设置最大堆大小为多少,它总是使用455MB(如消息栏所示:“内存使用情况:xxMB / 455MB”)。我已经尝试将其设置为非常合理的级别(1024 MB),但仍然只有455MB被分配。

有什么想法吗?

顺便说一句,我正在使用Ubuntu 10.04 32位,具有24GB内存,8个处理器核心。

更新: 这里是他们提供的JNLP。当我编辑initial-heap-sizemax-heap-size属性的值时,我得到相同的结果。

<jnlp spec="1.0+" codebase="http://bioinfo.cipf.es/blast2go/webstart" href="http://bioinfo.cipf.es/blast2go/webstart/makeJnlp.php?mem=3072">
<information>
<title>Blast2GO 3072M</title>
<vendor>CIPF - UPV - IVIA</vendor>
<homepage href="http://www.blast2go.org"/>
<description>Blast2GO 3072M</description>
<description kind="short">Blast2GO 3072M</description>
<icon href="splash.gif"/>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5+" initial-heap-size="64m" max-heap-size="3072M"/>
<jar href="ext/blast2go.jar"/>
<jar href="ext/biojava-1.3.1.jar"/>
<jar href="ext/jfreechart-1.0.10.jar"/>
<jar href="ext/mysql-connector-java-3.0.11-stable-bin.jar"/>
<jar href="ext/zvtm.jar"/>
<jar href="ext/jakarta-regexp-1.4.jar"/>
<jar href="ext/jcommon-1.0.13.jar"/>
<jar href="ext/Simpat1.1.jar"/>
<jar href="ext/iText-2.1.1.jar"/>
<jar href="ext/jdom/activation.jar"/>
<jar href="ext/jdom/ant.jar"/>
<jar href="ext/jdom/jaxen-core.jar"/>
<jar href="ext/jdom/jaxen-jdom.jar"/>
<jar href="ext/jdom/jdom.jar"/>
<jar href="ext/jdom/mail.jar"/>
<jar href="ext/jdom/saxpath.jar"/>
<jar href="ext/jdom/xalan.jar"/>
<jar href="ext/jdom/xerces.jar"/>
<jar href="ext/jdom/xml-apis.jar"/>
<jar href="ext/interpro/commons-cli-1.0.jar"/>
<jar href="ext/interpro/commons-cli.jar"/>
<jar href="ext/interpro/freefluo.jar"/>
<jar href="ext/interpro/servlet.jar"/>
<jar href="ext/interpro/WSInterProScan.jar"/>
<jar href="ext/axis_1_4/axis-ant.jar"/>
<jar href="ext/axis_1_4/axis.jar"/>
<jar href="ext/axis_1_4/commons-discovery-0.2.jar"/>
<jar href="ext/axis_1_4/commons-logging-1.0.4.jar"/>
<jar href="ext/axis_1_4/jaxrpc.jar"/>
<jar href="ext/axis_1_4/keggapi.jar"/>
<jar href="ext/axis_1_4/log4j-1.2.8.jar"/>
<jar href="ext/axis_1_4/saaj.jar"/>
<jar href="ext/axis_1_4/wsdl4j-1.5.1.jar"/>
<jar href="ext/axis2/activation-1.1.jar"/>
<jar href="ext/axis2/annogen-0.1.0.jar"/>
<jar href="ext/axis2/axiom-api-1.2.2.jar"/>
<jar href="ext/axis2/axiom-dom-1.2.2.jar"/>
<jar href="ext/axis2/axiom-impl-1.2.2.jar"/>
<jar href="ext/axis2/axis2-adb-1.1.1.jar"/>
<jar href="ext/axis2/axis2-adb-codegen-1.1.1.jar"/>
<jar href="ext/axis2/axis2-codegen-1.1.1.jar"/>
<jar href="ext/axis2/axis2-java2wsdl-1.1.1.jar"/>
<jar href="ext/axis2/axis2-jaxbri-1.1.1.jar"/>
<jar href="ext/axis2/axis2-jibx-1.1.1.jar"/>
<jar href="ext/axis2/axis2-kernel-1.1.1.jar"/>
<jar href="ext/axis2/axis2-saaj-1.1.1.jar"/>
<jar href="ext/axis2/axis2-soapmonitor-1.1.1.jar"/>
<jar href="ext/axis2/axis2-spring-1.1.1.jar"/>
<jar href="ext/axis2/axis2-tools-1.1.1.jar"/>
<jar href="ext/axis2/axis2-xmlbeans-1.1.1.jar"/>
<jar href="ext/axis2/backport-util-concurrent-2.2.jar"/>
<jar href="ext/axis2/commons-codec-1.3.jar"/>
<jar href="ext/axis2/commons-fileupload-1.1.1.jar"/>
<jar href="ext/axis2/commons-httpclient-3.0.1.jar"/>
<jar href="ext/axis2/commons-io-1.2.jar"/>
<jar href="ext/axis2/commons-logging-1.1.jar"/>
<jar href="ext/axis2/geronimo-spec-jms-1.1-rc4.jar"/>
<jar href="ext/axis2/jakarta-httpcore-4.0-alpha2.jar"/>
<jar href="ext/axis2/jaxb-api-2.0.2.jar"/>
<jar href="ext/axis2/jaxb-impl-2.0.2.jar"/>
<jar href="ext/axis2/jaxb-xjc-2.0.2.jar"/>
<jar href="ext/axis2/jaxen-1.1-beta-10.jar"/>
<jar href="ext/axis2/jibx-bind-1.1.3.jar"/>
<jar href="ext/axis2/jibx-run-1.1.3.jar"/>
<jar href="ext/axis2/mail-1.4.jar"/>
<jar href="ext/axis2/neethi-2.0.jar"/>
<jar href="ext/axis2/servletapi-2.3.jar"/>
<jar href="ext/axis2/stax-api-1.0.1.jar"/>
<jar href="ext/axis2/woden-1.0.0M6.jar"/>
<jar href="ext/axis2/wsdl4j-1.6.2.jar"/>
<jar href="ext/axis2/wstx-asl-3.2.0.jar"/>
<jar href="ext/axis2/xalan-2.7.0.jar"/>
<jar href="ext/axis2/xbean-2.2.0.jar"/>
<jar href="ext/axis2/xercesImpl-2.8.1.jar"/>
<jar href="ext/axis2/xml-apis-1.3.03.jar"/>
<jar href="ext/axis2/XmlSchema-1.2.jar"/>
<jar href="ext/batik/batik-anim.jar"/>
<jar href="ext/batik/batik-awt-util.jar"/>
<jar href="ext/batik/batik-bridge.jar"/>
<jar href="ext/batik/batik-codec.jar"/>
<jar href="ext/batik/batik-css.jar"/>
<jar href="ext/batik/batik-dom.jar"/>
<jar href="ext/batik/batik-extension.jar"/>
<jar href="ext/batik/batik-ext.jar"/>
<jar href="ext/batik/batik-gui-util.jar"/>
<jar href="ext/batik/batik-gvt.jar"/>
<jar href="ext/batik/batik-parser.jar"/>
<jar href="ext/batik/batik-script.jar"/>
<jar href="ext/batik/batik-svg-dom.jar"/>
<jar href="ext/batik/batik-svggen.jar"/>
<jar href="ext/batik/batik-swing.jar"/>
<jar href="ext/batik/batik-transcoder.jar"/>
<jar href="ext/batik/batik-util.jar"/>
<jar href="ext/batik/batik-xml.jar"/>
<jar href="ext/batik/js.jar"/>
<jar href="ext/batik/pdf-transcoder.jar"/>
<jar href="ext/batik/xalan-2.6.0.jar"/>
<jar href="ext/batik/xerces_2_5_0.jar"/>
<jar href="ext/batik/xml-apis-ext.jar"/>
<jar href="ext/batik/xml-apis.jar"/>
</resources>
<application-desc main-class="es.blast2go.prog.MainProg"/>
</jnlp>
更新:我尝试更改根jnlp标签中的href属性,但终端上出现了一个非常奇怪的消息。我想知道Java是否每次都会从这个URL重新下载JNLP并忽略我的编辑尝试。有没有办法可以防止这种情况发生?
> javaws blast2go3GB.jnlp 
Error occurred during initialization of VM
CCoouulldd  nnoott  crreesaetrev et heen oJuagvha  svpiarcteu aflo rm aocbhjiencet. 
heap
最终更新: 结果发现这是Java版本的问题。当我下载并使用Sun Java时,得到了预期的行为。

你如何指定需要多少内存? - Thorbjørn Ravn Andersen
我使用他们提供的链接并指定我需要的数量。 - Daniel Standage
刚刚做了同样的事情:2048输入后,该行是<j2se version="1.5+" initial-heap-size="64m" max-heap-size="2048M"/> - Thorbjørn Ravn Andersen
在我的Mac上(配备5GB内存和64位JVM),这行代码是"内存使用情况:18MB / 2043MB"。我建议你在一台64位的机器上尝试一下。 - Thorbjørn Ravn Andersen
是的,我编辑了那一行。无论我为初始堆大小和最大堆大小设置什么值,它总是455MB。 - Daniel Standage
我正在运行4GB RAM的64位Windows Vista和32位JVM。我选择了1500MB链接,状态栏显示“内存使用情况:29MB / 1450MB”。 - Enrique
6个回答

4
您可以像这样在j2se标签中指定堆大小:
    <resources>
    .........
            <j2se version="1.6.0+" href="" initial-heap-size="1024m" max-heap-size="3000m" />
            <j2se version="1.5.0_05" href="" initial-heap-size="1024m" max-heap-size="3000m" />
            <j2se version="1.4.2_04" href="" initial-heap-size="1024m" max-heap-size="3000m" />        
    .........
    </resources>

请指定您将使用的每个JRE版本。


据我所知,系统上只有一个jre。他们创建的.jnlp文件只有一个j2se标签,它的版本是1.5+。我在我的系统上运行的是1.6.0_18,所以应该没问题。 - Daniel Standage
@Daniel 你尝试过在没有jnlp的情况下运行你的应用程序吗?(从命令行运行java -jar myapp.jar -Xms1024m -Xmx3000m)当从命令行运行时,你是否遇到了相同的问题? - Enrique

3

如果您使用的是32位Linux,则只能运行32位JVM,每个实例的内存限制约为4 GB。即使您的内核可见内存更多,我认为情况也是如此。

如果您真的需要单个JVM中大量的内存,则需要使用64位。


编辑:对于OpenJDK,Java WebStart没有开源,因此需要使用替代实现。请尝试下载并使用Sun Java。只需下载并解压缩JDK,然后运行bin/javaws foo.jnlp即可。


太好了,但是当我请求1,024MB时,为什么只分配455MB? - Daniel Standage
你可能会做错,而这是默认行为。或者它只会给你它所能提供的。很难说 - 给我看看 JNLP。 - Thorbjørn Ravn Andersen
好的,JNLP来自链接页面。请参见问题的评论。 - Thorbjørn Ravn Andersen
结果是一样的,无论我是否编辑他们提供的JNLP文件。不过我会把它发布出来。 - Daniel Standage
@Thorbjorn,肯定是javaws版本的问题。我不知道Ubuntu不再使用Sun Java。我下载/解压了最新的JDK。当有可用内存时它会给我所需的内存,并在我尝试分配过多时提供有用的错误信息。谢谢! - Daniel Standage
显示剩余2条评论

2
尝试使用手动命令行参数进行设置。类似这样的内容:

<j2se version="1.6+" java-vm-args="-Xms3072m"/>


2

您可以通过命令行选项来简单更改它,例如:

最初的回答

javaws -J-Xmx16384m -J-Xms16384m <jnlp url>

1

你尝试过从blast2go起始页中提供的解决方案吗?

"Blast2GO需要更多内存?使用动态内存JNLP URL:"

http://bioinfo.cipf.es/blast2go/webstart/makeJnlp.php?mem=<put here the amount of memory you need>

这里发生了什么并不清楚,但我认为blast2go可能正在执行一些手动内存管理技巧。(它声称报告使用的内存量是这种情况的指示。)如果是这种情况,则可能需要设置特定于应用程序的参数或属性,如果您调整JNLP文件。


他们只是将数字放在JNLP的正确位置,没有什么花哨的东西。 - Thorbjørn Ravn Andersen
这就是我一直在使用的。无论我为内存量设置什么值,我只得到455MB。 - Daniel Standage

0
在生产环境中,如果客户想要根据客户端机器上的系统配置(如 RAM 大小)自定义 jnlp 中的 Java 堆大小。

APPLICATION_TEMPLATE.JNLP 中的更改:使用 * 接受可配置值

appliation.jnlp 中的更改:

将实际值传递给 intial-heap-size 和 max-heap-size。 jnlp 文件支持脚本和表达式。

  • 使用脚本 <% %> 读取已配置值的属性文件
  • 通过 <%=> 表达式将实际值指向 intial-heap-size 和 max-heap-size

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接