Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8090196

WebView freeze with hight CPU usage when opening specific web-page

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Fix
    • Icon: P3 P3
    • 7-pool
    • 7u67
    • javafx
    • JDK 1.7.0_67 (64bit)
      Windows 8.1

    • web

      When i open our web-page in the WebView a few frames are painted and then JavaFX freezes with high CPU usage. The Swing-Threads still work properly.

      In JavaFX 8.0.20 this works.

      The website uses AngularJS and is probably relatively big.
      I tested the WebView with other AngularJS pages and they work just fine.

      By using different debugging tools i found out, that the JavaFX Application Thread is stuck in the pulse() method forever or at least for a long time.
      Now an then (several minutes) it can leave this call and actually updates 1 frame of the WebView.

      "JavaFX Application Thread" prio=6 tid=0x0000000018a3f000 nid=0x241c runnable [0x00000000196dd000]
         java.lang.Thread.State: RUNNABLE
      at com.sun.webpane.webkit.Timer.twkFireTimerEvent(Native Method)
      at com.sun.webpane.webkit.Timer.fireTimerEvent(Timer.java:66)
      at com.sun.webpane.webkit.Timer.notifyTick(Timer.java:47)
      - locked <0x0000000702462fb8> (a com.sun.webpane.webkit.Timer)
      at javafx.scene.web.WebEngine$PulseTimer$2.pulse(WebEngine.java:915)
      at com.sun.javafx.tk.Toolkit$5.run(Toolkit.java:363)
      at com.sun.javafx.tk.Toolkit$5.run(Toolkit.java:361)
      at java.security.AccessController.doPrivileged(Native Method)
      at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:361)
      at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:384)
      at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:463)
      at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(QuantumToolkit.java:332)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17)
      at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67)
      at java.lang.Thread.run(Thread.java:745)

      With the profiler i see that this is the most active method:
      java.net.SocketInputStream.read(byte[], int, int, int)
      Self time: 89242 ms (92,8%)
      Invocations: 1322

      The memory consumption seems to be stable, but a lot of GCs happen.


      With ProcessExplorer i made a windows Stack-Dump of the two active threads:

      Thread 1:
      jvm.dll!JVM_FindSignal+0x9caa7
      jvm.dll!JVM_ResolveClass+0x28551
      jvm.dll!JVM_ResolveClass+0x1e994
      jvm.dll!JVM_FindSignal+0x9c8e2
      jvm.dll!JVM_ResolveClass+0x1eb75
      jvm.dll!JNI_CreateJavaVM+0xb65
      jvm.dll!JNI_CreateJavaVM+0xc136
      jfxwebkit.dll!WTFReportBacktrace+0xec
      jfxwebkit.dll!WTFReportBacktrace+0x946
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x48491
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x49055
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4d150
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4d96e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4de34
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x40643
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xbaf3e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xc063b
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xc4dbb
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xb9d87
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3d321
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x3e4dd
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4064e
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x27757
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xda63c
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x218191
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x21858d
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x70c4
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x8020
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x218018
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x105aae
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x118627
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x1246f2
      jfxwebkit.dll!JSPropertyNameArrayGetCount+0xcd512
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x67d2
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x2bc34
      jfxwebkit.dll!WTFReportBacktrace+0x30837
      jfxwebkit.dll!WTFReportBacktrace+0x35722
      jfxwebkit.dll!WTFReportBacktrace+0x15b8c
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x6a7b
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x6c7b
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x18855
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x130ef4
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x130fb7
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x1f7ce9
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x119b61
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x11a959
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xfd43


      Thread 2:
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x51ffb
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x522ae
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x80904
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x522ae
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x4f0b5
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x8e850
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x8e9ae
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x218276
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x21858d
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x6e4d
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0x8020
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x218018
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x105aae
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x118627
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x1246f2
      jfxwebkit.dll!JSPropertyNameArrayGetCount+0xcd512
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x67d2
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x2bc34
      jfxwebkit.dll!WTFReportBacktrace+0x30837
      jfxwebkit.dll!WTFReportBacktrace+0x35722
      jfxwebkit.dll!WTFReportBacktrace+0x15b8c
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x6a7b
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x6c7b
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x18855
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x130ef4
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x130fb7
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_HTMLObjectElementImpl_checkValidityImpl+0x1f7ce9
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x119b61
      jfxwebkit.dll!Java_com_sun_webpane_webkit_dom_EventListenerImpl_twkDispatchEvent+0x11a959
      jfxwebkit.dll!Java_com_sun_webpane_webkit_network_URLLoader_twkDidReceiveResponse+0xfd43

      It seems there are several threads (at least 3) that alternate in using the CPU.
      2 are most active, while the others do only a little bit.
      Then one of the active ones becomes inactive and another one becomes active.

      Here is a sample app which connects to our testserver and produces the problem:

      The "engine.executeScript" call is an attempt to register FirebugLite in the website to see what is happening, but this code is never executed since the page never reaches the SUCCEEDED state. For other working pages this embedding works fine.

      import java.applet.Applet;
      import java.awt.BorderLayout;
      import java.awt.Font;
      import java.awt.Frame;
      import java.awt.event.MouseWheelEvent;
      import java.awt.event.MouseWheelListener;
      import java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
      import java.net.MalformedURLException;
      import java.net.URL;
      import java.util.List;
      import java.util.concurrent.CopyOnWriteArrayList;

      import javafx.application.Platform;
      import javafx.beans.value.ChangeListener;
      import javafx.beans.value.ObservableValue;
      import javafx.concurrent.Worker.State;
      import javafx.embed.swing.JFXPanel;
      import javafx.scene.Scene;
      import javafx.scene.web.WebEngine;
      import javafx.scene.web.WebView;

      import javax.swing.JPanel;

      import com.sun.javafx.runtime.VersionInfo;

      public class JavaFXTest extends Applet
      {

      @Override
      public void init()
      {
      setLayout(new BorderLayout());
      final HTMLPanel htmlPanel = new HTMLPanel();
      add(BorderLayout.CENTER, htmlPanel);

      htmlPanel.loadURL("http://testserver.knuddels.de/logincheck.html?nick=JavaFX&pwd=ppp&setCookieInResponse=true");
      htmlPanel.loadURL("http://testserver.knuddels.de", true);
      }

      private static class HTMLPanel extends JPanel
      {

      private static final long serialVersionUID = -6272445527425893706L;

      private final JFXPanel jfxPanel = new JFXPanel();
      private WebEngine engine;
      private volatile boolean isInitialized;

      public HTMLPanel()
      {
      super(new BorderLayout());
      Platform.setImplicitExit(false);
      }

      private void initComponents()
      {
      if (!isInitialized)
      {
      this.isInitialized = true;
      createScene();
      this.add(jfxPanel, BorderLayout.CENTER);
      }
      }

      private void createScene()
      {
      Platform.runLater(new Runnable()
      {

      public void run()
      {
      WebView view = new WebView();
      engine = view.getEngine();

      engine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>()
      {

      public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value)
      {
      if (engine.getLoadWorker().getState() == State.FAILED)
      {
      System.out.println("Error on: " + engine.getLocation());
      if (old != null)
      {
      old.printStackTrace();
      }
      if (value != null)
      {
      value.printStackTrace();
      }
      }
      checkLoadUrls();
      }

      });
      engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>()
      {

      public void changed(ObservableValue<? extends State> o, State old, final State state)
      {
      if (state == State.SUCCEEDED)
      {
      System.out.println("Page loaded: " + engine.getLocation());
      if (!checkLoadUrls())
      {
      engine.executeScript("if (!document.getElementById('FirebugLite')){E = document['createElement' + 'NS'] && document.documentElement.namespaceURI;E = E ? document['createElement' + 'NS'](E, 'script') : document['createElement']('script');E['setAttribute']('id', 'FirebugLite');E['setAttribute']('src', 'https://getfirebug.com/&#39; + 'firebug-lite.js' + '#startOpened');E['setAttribute']('FirebugLite', '4');(document['getElementsByTagName']('head')[0] || document['getElementsByTagName']('body')[0]).appendChild(E);E = new Image;E['setAttribute']('src', 'https://getfirebug.com/&#39; + '#startOpened');}");
      }
      }
      }

      });

      jfxPanel.setScene(new Scene(view));
      }
      });
      }

      private static String toURL(String str)
      {
      try
      {
      return new URL(str).toExternalForm();
      }
      catch (MalformedURLException exception)
      {
      return null;
      }
      }

      public void loadURL(final String url)
      {
      loadURL(url, false);
      }

      private List<String> urlsToLoad = new CopyOnWriteArrayList<String>();

      public void loadURL(final String url, boolean queue)
      {
      if (queue)
      {
      urlsToLoad.add(url);
      }
      else
      {
      initComponents();
      Platform.runLater(new Runnable()
      {

      public void run()
      {
      String tmp = toURL(url);

      if (tmp == null)
      {
      tmp = toURL("http://" + url);
      }

      engine.load(tmp);
      }
      });
      }
      }

      private boolean checkLoadUrls()
      {
      if (!urlsToLoad.isEmpty())
      {
      String url = urlsToLoad.remove(0);
      loadURL(url);
      return true;
      }
      return false;
      }

      }

      public static void main(String[] args)
      {
      Frame f = new Frame("JavaFXTest: " + VersionInfo.getVersion());
      f.addWindowListener(new WindowAdapter()
      {

      @Override
      public void windowClosing(WindowEvent e)
      {
      System.exit(0);
      }

      });
      f.setFont(new Font("Arial", Font.PLAIN, 16));
      JavaFXTest app = new JavaFXTest();
      f.add("Center", app);
      app.init();
      f.setSize(1024, 800);
      f.setResizable(true);
      f.setVisible(true);
      }

      }

            anashaty Anton Nashatyrev (Inactive)
            fleitenbejfx Frederic Leitenberger (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            8 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: