2016-03-28 14 views
1

Javafx'te WebView ile çalışırken bir sorunla karşılaştım. Görev yöneticimdeki bellek kullanımı her şeyin ötesine geçiyor ve bir çökme ile biter.Birçok sayfa yüklerken Javafx WebView'da patlayan bellek kullanımı

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Worker; 
import javafx.scene.Scene; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class WebViewSample extends Application { 

    public boolean cycle = false; 

    public static void main(String[] args) { 
     launch(); 
    } 

    @Override public void start(Stage primaryStage) { 

     WebView webView = new WebView(); 
     WebEngine engine = webView.getEngine(); 

     engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 
      @Override 
      public void changed(ObservableValue<? extends Worker.State> obs, Worker.State old, Worker.State current) { 

       if(javafx.concurrent.Worker.State.SUCCEEDED == current) { 
        if(cycle) { 
         engine.load("http://www.google.com"); 
        } else { 
         engine.load("http://www.yahoo.com"); 
        } 
        cycle = !cycle; 
       } 
      } 
     }); 

     engine.load("http://www.google.com"); 
     primaryStage.setScene(new Scene(webView)); 
     primaryStage.show(); 
    } 
} 

Yani temelde kod sadece iki web sitesi değişerek yükler:

Sorunu yeniden oluşturmak için basit bir kod örneği var! Sorunum, yalnızca bu iki Sayfa ile değil, ana programımdaki tüm farklı URL'leri yüklemiyorum. Ama bu da Sorunu yeniden yaratıyor.

boyunca hep şeffaf şimdiye kadar çalıştı. Resim yükleme

  • engine.getHistory() çağırarak engellemek için bir URLStreamHandlerFactory bina System.gc()
  • arayarak

    • setMaxSize (0)
    • i visualvm ile süreçlerini, - ve bellek kullanımı orada isnt
    • engine.load patlayan bulundu: yükleme sayfaları arasında ("about boş")

    Im gerçekten bu çünkü benim örnekte bir hata olup olmadığını shure değil çözümün her türlü, 3 gün boyunca Googling, ben herhangi

    Im memnun şey veya doğal bir şey ... cevapsız yardım, thx!

    • Java 1.8.0_77
  • cevap

    0

    Düzenlendi 22/07/2016: Anlaşılan bu JDK 9 giderilmiştir: Biz de benzer gördük http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8159594


    JDK 1.8.0_92 kullanarak davranış.

    Sadece bu iki sayfa arasında geçiş yapmak, bellek kullanımının kontrolsüz bir şekilde yükselmesine neden olur.

    Page1:

    <head></head> 
    <body> 
        <h1>Page 1</h1> 
        <script> 
        window.location.href = "page2.html"; 
        </script> 
    </body> 
    

    Sayfa 2:

    <head></head> 
    <body> 
        <h1>Page 2</h1> 
        <script> 
        window.location.href = "page1.html"; 
        </script> 
    </body> 
    

    Şu anda bu bariz bellek sızıntısı herhangi bir çözüm bulmak mümkün değildir.

    +0

    @jewelsea Adil olmak gerekirse OP aslında bir soru sormadı. “Benim örneğimde bir yanlışlıktan dolayı gerçekten korkmuyorum” diye yanıt verdiler. Buna cevaben, bu problemi de gördüğümüzü doğruladık, yani onların hatalarının olması pek olası değil. –