我目前正在使用Javafx 2作爲項目,我可能需要長時間在無限循環中播放視頻。在Windows上,當視頻播放時,我的proifiler工具顯示非常普通的圖片,cpu加載不是非常困難(運行在2個內核上,大約是2x40-50%),內存使用率高達250 MB左右,這是正常的。 但是,當我在Ubuntu機器上部署應用程序時,CPU負載每個內核大約增加70%(儘管它是一個雙核心原子處理器,所以我們假設這是正常的),並且內存使用率不斷增加, JVM和設備本身,需要1,5-2小時。 我真的需要一個解決方案,或至少解決這個問題,因爲它現在是一個showstopper。JavaFX媒體播放器燒傷資源
我目前正在考慮繞過無限循環,併爲每個循環創建一個新的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);
這是一個超類的函數,timeo在這種情況下utFuture爲null。無論如何,該功能在這種情況下不會被調用。
編輯:峯值內存使用情況看起來也在我的Windows機器上緩慢爬行,但在Ubuntu機器上的速度遠不及。現在我要離開它,直到晚上,之後,我會更新情況。
編輯2:在Windows上運行應用程序的夜晚後,它仍然運行,沒有任何問題。
每次視頻結束時,我都嘗試重新加載媒體播放器頁面,但沒有任何更改,內存仍然用完了2小時。
我已經創建了一個新的jar,只有在啓動頁面上有一個MediaView,沒有其他東西,打包了我在Windows機器上使用的jfxrt.jar文件,它仍然泄漏。
機器上使用的JRE是oracle-java7-installer軟件包安裝的JRE。我曾嘗試使用OpenJDK,但未能運行該應用程序。
用於播放視頻的庫由libavformat53包安裝。沒有它,在試圖播放視頻時有一個例外。據我所知,這個軟件包被VLC使用,沒有錯誤,所以我變得非常惱火。
如果使用[Java 8](https://jdk8.java.net/download.html),它會更好嗎? – jewelsea
我無法使用java 8進行這個項目,所以不知道,對不起。 – Robert
我並不是要求你爲項目使用Java 8。我要求你嘗試在Java 8下的機器上運行程序,看看它是否表現出相同的行爲。 – jewelsea