2014-02-27 54 views
0

我目前正在使用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使用,沒有錯誤,所以我變得非常惱火。

+0

如果使用[Java 8](https://jdk8.java.net/download.html),它會更好嗎? – jewelsea

+0

我無法使用java 8進行這個項目,所以不知道,對不起。 – Robert

+0

我並不是要求你爲項目使用Java 8。我要求你嘗試在Java 8下的機器上運行程序,看看它是否表現出相同的行爲。 – jewelsea

回答

0

當我上次在我的臺式電腦上安裝Linux(Ubuntu或Debian)時,也許在3或4年前,我遇到了類似的問題,需要使用顯卡。原因在於,對於圖形應用程序,兩種Linux發行版都只能使用NVidia適配器可靠地快速運行&;對於ATI那裏只有通用驅動程序可用(因爲他們拒絕透露他們的源代碼)。 今天的情況可能會有所不同 - 但作爲第一步,我肯定會確保我安裝了最適合Linux的圖形驅動程序......