2014-05-15 63 views
4

我試圖通過在JavaFX中使用webview來製作UI,但有一個問題,當使用彈出窗口打開大圖像時,內存使用量非常大,並且彈出是關閉,內存使用情況不下降,我通過任務管理器在Windows中看到內存使用情況,如何在關閉階段後清除Javafx Webview內存使用情況

當使用webview打開大小約爲8MB的圖像時,內存達到300MB在使用中,我不明白爲什麼它是如此之大,

我已經試過

stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 

     @Override 
     public void handle(WindowEvent event) { 
      webengine.load(null); 

     } 
    }); 

但仍然,不要使內存中釋放

回答

7

也許,你看到的RT-33729 WebView leaks WCImgDecoderImpl instances一個實例,當前的目標是固定的Java 8u20。在RT-33729中,開發人員(Leonid Popov)寫道:

Webkit具有用於網頁(包括圖像)的資源緩存。 即使在不是 引用的情況下,它仍繼續保留未使用的(「死」)資源,以防用戶按下「返回」以避免 加載已加載的資源,同時它們不會保留太多的空間 。詳情請參閱在Webkit的源代碼註釋:

http://trac.webkit.org/browser/trunk/Source/WebCore/loader/cache/MemoryCache.h

WCImgDecoderImpl的實例是由BitmapImage的公司由存儲在的MemoryCache CachedImage的 引用引用 的ImageSource的通過JNI引用。我通過修改緩存來測試它,以便它完全清除其緩存的資源,並觀察到所有 WCImgDecoderImpl已經消失。雖然可以從WebKit本機代碼訪問WCImgDecoderImpl 的實例,但它並非無用。點 是WebKit通過JNI來規定WCImgDecoderImpl 的生命週期。調查這個緩存如何在WebView上強制刷新 ,目前仍在繼續。

從說明中討論測試應用程序。當您從場景中刪除 WebView時,它不會立即被刪除(並且因此它不會釋放任何資源 )。相反,它有一個處理程序註冊 在處理程序線程(類似於AWT使用的處理程序),它應該在一定時間內回撥它並導致WebEngine使用 本地資源釋放。

此外,我建議導航到「about:blank」,然後刪除 WebView;它會使它立即釋放一些資源。

但是,也許你看到的完全是另一回事,我不能告訴你確切,如什麼原因RT-35262 JVM crash due to memory leak in WebView/Webkit,也由於對Java 8u20或RT-34630 WebView memory leak when JavaScript callbacks are assigned解決,由於需要解決的Java 9

3

我的代碼(適用於我),受jewelsea的回答啓發。

// Delete cache for navigate back 
webEngine.load("about:blank"); 
// Delete cookies 
java.net.CookieHandler.setDefault(new java.net.CookieManager()); 
0

我已經廣泛地在網上搜索,發現所有類型的解決方案,可惜沒有一次成功形成了我。看起來,不管正在做什麼,現場都被JFXPanel分道揚scene。對我有效的是以下幾點:

Scene scene = getScene(); 
jfxPanel.removeAll(); 
jfxPanel.setScene(scene); 
WebView webView = (WebView) scene.getRoot(); 
webView.getWebEngine().load(url); 

的getScene()重新使用以前創建的場景(其網頁視圖和WebEngine),創建一個新的場景時,JFXPanel變得不可見。所以解決方案在於刪除和重新設置現有的場景,然後加載url。