我编写了一个JavaFX应用程序,其中包括通过JNA进行设备交互,并且在将其作为独立应用程序运行时没有问题,但是当嵌入浏览器时,并且在很长一段时间内,应用程序逐渐减慢并最终停止响应。使用JVisualVM来分析和监视应用程序,我可以看到堆在内存耗尽和旧的内存空间已满之前失控。
我能够找到另一个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参数
相反,它们在系统属性选项卡下的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而不使用。
答案 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+
),但也许他们也会做不同的事情。