如何使用特定的JVM参数正确启动嵌入式JavaFX applet

时间:2014-05-28 15:52:30

标签: applet javafx jvm jvm-arguments jvm-hotspot

我编写了一个JavaFX应用程序,其中包括通过JNA进行设备交互,并且在将其作为独立应用程序运行时没有问题,但是当嵌入浏览器时,并且在很长一段时间内,应用程序逐渐减慢并最终停止响应。使用JVisualVM来分析和监视应用程序,我可以看到堆在内存耗尽和旧的内存空间已满之前失控。

Monitor

Visual Garbage Collection

我能够找到另一个question,它建议将参数传递给VM以强制更频繁地进行垃圾收集。但是由于jvm参数没有坚持,我无法测试该建议。

修改 MyJavafxApp.html ,如下所示:

function javafxEmbed() {
        dtjava.embed(
            {
                id: 'myApp',
                url : 'demo_javafx.jnlp',
                placeholder : 'javafx-app-placeholder',
                width : '1100',
                height : '800',
                jnlp_content : 'PD94...'
            },
            { 
                jvm: "1.6.0+",
                javafx : '2.2+',
                jvmargs: "-XX:MaxDirectMemorySize=128M -Xmx256m"
            },
            {}
        );
    }

我无法将参数视为 JVM标志 JVM参数

enter image description here

相反,它们在系统属性选项卡下的JVisualVM中显示,并在 UsageTracker-AppName 下显示为单个字符串

UsageTracker-AppName=http://localhost:8000/target/web/demo_javafx.html: java_status_events=true jnlp_href=demo_javafx.jnlp separate_jvm=true jnlp_embedded=PD94... java_arguments=-DXX:MaxDirectMemorySize=32m,-Xmx128m,-Xms32m width=1375 javafx_version=2.2+ code=dummy.class type=application/x-java-applet id=myApp javafx_applet_id=myApp height=1000 scriptable=true codebase=http://localhost:8000/target/web/

如何使用参数启动JVM?

注意:我缩短了jnlp_content字符串。我还尝试使用-D标志传递jvmargs而不使用。

1 个答案:

答案 0 :(得分:1)

在您的JNLP文件中,您可以传递这样的VM参数:

<j2se version="1.6+" java-vm-args="-Djnlp.fx=2.1+ -Djnlp.tk=swing" />

我还发现其中一些参数可以作为applet参数传递:

<applet ...>
    <param name="javafx_version" value="2.1+" />
    <param name="scriptable" value="true" />
</applet>

将其传递给dtjava.embed()也应该有效。

Deploying JavaFX Applications中描述了如何:

var app = new dtjava.App(
        'ssh.jnlp', 
    {
        id: 'SSH',
        width: 100,
        height: 25,
        placeholder: 'SSH_application_container', 
        params: { 
            config: 'ssh_application.conf', 
        } 
    }
);

var platform = new dtjava.Platform({
    javafx: "2.1+",
    jvmargs: "-Dapp.property= ? -Xmx1024m"
});

dtjava.launch(app, platform);

您使用的语法也应该有用。也许这只是一个关于将哪个参数放在哪里的问题(如在app-parameter或vm-parameter中)。同样的参数似乎可以通过不同的方式传递不同的名称(例如javafx: "2.1+", <param name="javafx_version" value="2.1+" /> -Djnlp.fx=2.1+),但也许他们也会做不同的事情。