【问题标题】:How to correctly start embedded JavaFX applet with specific JVM arguments如何使用特定的 JVM 参数正确启动嵌入式 JavaFX 小程序
【发布时间】:2014-05-28 15:52:30
【问题描述】:

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

我找到了另一个question,它建议将参数传递给虚拟机以强制进行更频繁的垃圾收集。但是,由于 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 参数

而是将它们显示在 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 而没有。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    <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+",&lt;param name="javafx_version" value="2.1+" /&gt;-Djnlp.fx=2.1+),但也许它们也做不同的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2011-01-24
      • 2016-02-17
      • 2013-12-27
      相关资源
      最近更新 更多