JavaFx导致Linux下的XOrg资源泄漏

时间:2016-07-19 15:49:29

标签: linux javafx resources

我在Linux下遇到了JavaFX的严重问题。也许有人知道解决方案或解决方法:

症状:

  • 在Linux下运行JavaFx应用程序会导致Xorg资源泄漏,从而增加Java进程和Xorg进程的CPU负载。
  • 使用Linux工具xrestop可以观察到资源泄漏。
  • 停止应用程序时,资源被释放,Xorg进程的CPU负载正常。

经过测试的Linux版本:

  • Debian 8.5(64位),
  • Ubuntu 15.10和16.04(64位和32位)
  • Manjaro(64位)

经测试的硬件:

  • Intel CPU和Intel CPU图形,
  • Intel CPU和AMD显卡。

经过测试的JDK:Oracle JDK 8.91,OpenJDK 1.8.0_91和OpenJfx 8.

在Windows机器上,JavaFx应用程序运行没有问题。即使在Windows主机下运行在VmWare中的Linux客户机上,JavaFx应用程序也可以在没有资源泄漏的情况下运行。

即使您使用常量对象并更改这些对象的可见性,GUI上的每次更改都会出现资源泄漏。

重现泄漏的示例程序:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class HelloWorld extends Application {

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        Label lblTick = new Label("Tick");

        GridPane pane = new GridPane();
        pane.add(lblTick, 0, 0);

        KeyFrame kf = new KeyFrame(Duration.millis(100),
            e -> lblTick.setVisible(!lblTick.isVisible()));

        Timeline tl = new Timeline(kf);
        tl.setCycleCount(Animation.INDEFINITE);
        tl.play();

        Scene scene = new Scene(pane, 30, 30);
        stage.setScene(scene);
        stage.show();
    }
}

感谢任何帮助。

我找到了这个错误的原因和解决方法:

  • 原因是Linux的硬件图形加速错误。
  • 解决方法是使用参数-Dprism.order = sw
  • 启动JavaFx应用程序

该错误也包含在JDK 9中。

我将此报告为Oracle的错误。

0 个答案:

没有答案