Java 8u161/8u162使Swing应用程序使用CPU

Bri*_* S. 18 java swing

当在8u161或8u162上运行Swing应用程序并且焦点在JTextField中并且切换到另一个应用程序(如Chrome)并返回到应用程序时,我的8核Windows 10 PC上的CPU使用率增长到15%(就好像整个核心是忙着处理事件).

只需运行应用程序并切换几次.如果单击选项卡式窗格中的选项卡,CPU使用率将按预期降至0.

public class Test {
  public static void main(String... args) {
    SwingUtilities.invokeLater(() -> {
      JFrame f = new JFrame("Test");
      JTabbedPane tp = new JTabbedPane();
      tp.addTab("tab 1", new JTextField(20));
      f.add(tp);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.pack();
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图查看事件队列以查看发生了什么,它看起来很像上次事件被反复处理

如果我将它添加到上面的程序中,我会得到很多java.awt.event.InvocationEvent [INVOCATION_DEFAULT,runnable = sun.awt.windows.WInputMethod ...

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue(){
  @Override protected void dispatchEvent(AWTEvent event) {
    System.out.println(event);
    super.dispatchEvent(event);
  }
});
Run Code Online (Sandbox Code Playgroud)

在8u151,8u152和9.0.4上正常工作

我有很多客户正在升级到161并且遇到了这个问题,所以对于解决方法的任何建议都非常感谢. 我向Oracle提交了一个错误

JProfiler显示了这个: 在此输入图像描述

好像在8u172 b02上工作正常

OpenJDK的这是由引进 8184016和固定8183504

小智 0

您的客户使用输入法吗?如果您不需要启用输入法,我建议您可以将其禁用。

public class Test {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              JFrame f = new JFrame("Test");
              JTabbedPane tp = new JTabbedPane();
              JTextField tf = new JTextField();
              tf.enableInputMethods(false); // disable IM
              tp.addTab("tab 1", tf);
              f.add(tp);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.pack();
              f.setLocationRelativeTo(null);
              f.setVisible(true);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)