JavaFX媒体播放器会消耗资源

时间:2014-02-27 18:01:39

标签: java memory-leaks javafx javafx-2 media-player

我目前正在使用Javafx 2进行项目,我可能需要在无限循环中播放视频很长一段时间。在Windows上,当视频播放时,我的proifiler工具显示非常正常的图片,cpu负载不是很难(在2个内核上运行它大约是2x40-50%),内存使用量大约250 MB,这是正常的。 但是,当我在Ubuntu机器上部署应用程序时,每个核心的CPU负载大约为70%(尽管它是双核原子处理器,所以我们说这是正常的),并且内存使用量不断增加,同时最终杀死了JVM和设备本身一样,在1.5-2小时之内。 我真的需要一个解决方案,或至少解决这个问题,因为它现在是一个showstopper。

我目前正在考虑破解无限循环,并为每个循环创建一个新的Media / MediaPlayer对象,但我不确定,它是否能解决问题。

你能否就这个问题给我一些见解?

我的初始化MediaView的代码:

final Media m = new Media(new File(new ClientParameters().getProperty("video.path", String.class)).toURI()
                .toString());
        final MediaPlayer player = new MediaPlayer(m);
        player.setMute(true);
        player.setCycleCount(MediaPlayer.INDEFINITE);
        player.setOnError(new Runnable() {
            @Override
            public void run() {
                log.warn("Video error", player.getError());
                Main.loadAcceptablePrompt(Main.getCurrentLocaleResources().getString("Video_Hiba"),
                        FxmlView.START_SCREEN, Main.DEFAULT_LOCALE, ScreenSaverVideoController.this);
            }
        });

        m.setOnError(new Runnable() {
            @Override
            public void run() {
                showLoader();
                Main.getScheduler().submit(new Runnable() {
                    @Override
                    public void run() {
                        log.warn("Video error", player.getError());
                        Main.loadAcceptablePrompt(Main.getCurrentLocaleResources().getString("Video_Hiba"),
                                FxmlView.START_SCREEN, Main.getCurrentLocale(), ScreenSaverVideoController.this);
                    }
                });
            }
        });
        video.setMediaPlayer(player);
        video.getMediaPlayer().play();

Main.getScheduler()返回此Scheduler对象:

private static final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);

Main.loadAcceptablePrompt首先调用以下函数,而不是加载新的fxml视图:

if (timeoutFuture == null || timeoutFuture.isCancelled() || timeoutFuture.isDone()) return false;
        return timeoutFuture.cancel(true);

这是来自超类的函数,在这种情况下,timeoutFuture为null。无论如何,在这种情况下不会调用该函数。

编辑:峰值内存使用率看起来也在我的Windows机器上慢慢爬行,但远不及Ubuntu机器上的速率。现在我要离开它跑了一夜,之后,我会更新情况。

编辑2:在Windows上运行应用程序过夜之后,它仍然运行,没有任何问题。

我每次视频播放时都试图重新加载媒体播放器页面,但没有任何改变,内存仍然用完了2个小时。

我创建了一个新jar,只在启动页面上有一个MediaView,其他内容没有,将我在Windows机器上使用的jfxrt.jar文件打包到其中,它仍然泄漏。

机器上使用的JRE是oracle-java7-installer软件包安装的JRE。我曾尝试使用OpenJDK,但无法运行该应用程序。

用于播放视频的库由libavformat53软件包安装。没有它,在播放视频时会有例外。据我所知,这个包被VLC使用,没有错误,所以我很生气。

1 个答案:

答案 0 :(得分:0)

当我上次在我的台式机上安装Linux(Ubuntu或Debian)时,也许3或4年前我遇到了类似的问题需要显卡。原因是对于图形应用程序而言,两个Linux发行版只能快速运行。使用NVidia适配器可靠;对于ATI那里只有通用驱动程序可用(因为他们拒绝透露他们的源代码)。 也许今天的情况有所不同 - 但是作为第一步,我肯定会确保我安装了最适合Linux的图形驱动程序......