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