在最小化的RDP会话中调用重绘时使用大量CPU进行Swing

Ord*_*ous 11 java swing remote-desktop

当我在VM中运行Swing应用程序时,我正在观察Java 8(几个版本,特别是1.8.0_111)的一些奇怪行为.VM是在VMware中运行的Windows 10计算机,我远程桌面插入.我没有尝试使用实际的桌面而不是虚拟机来执行此操作,但我计划尽快删除额外的故障点.

我已经设法用这个最小的程序重现它:

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        for (int i = 0; i < 3; i++) {
            JPanel subpanel = new JPanel();
            JComboBox<?> box = new JComboBox<>();
            subpanel.add(box);
            panel.add(subpanel);
        }
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

        Timer timer = new Timer(1000, e -> {
            frame.repaint();
        });
        timer.setRepeats(true);
        timer.start();
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我只是正常启动,它会重新绘制,完全没有问题,只有一个带有3个空组合框的框架,正如预期的那样.如果我最小化RDP会话窗口,则会出现此问题.如果发生这种情况(并且框架没有图标化),那么Swing会开始吃掉不健康的CPU,直到我再次打开RDP窗口.

我已经尝试进一步最小化代码示例,但是将组合框计数减少到2,删除subpanel或设置单火定时器(而不是重复,即使在RDP最小化时重绘会发生)都可以防止错误发生.

这是CPU利用率图:http:
//i67.tinypic.com/23rwglx.png

我试过在这些尖峰期间对应用程序进行分析,试图看看到底发生了什么.以下是JVisualVM中的分析器的结果:http://i68.tinypic.com/apdwed.png

和采样器(删除包过滤器后):http:
//i67.tinypic.com/2071735.png

我无法轻易看到可能会占用CPU的东西ProcessingRunnable.有没有人有任何经验,当Swing突然没有画画时会做什么?

Ord*_*ous 2

我已将其作为错误报告发布给 Oracle。当链接出现任何详细信息(接受或拒绝)时,我将更新此答案。

已经发布了几个类似的 错误,并以“无法重现”作为解决方案,但它们不涉及虚拟机,仅涉及 RDP 会话(我无法通过 RDPing 到我的工作桌面而不是虚拟机来触发此错误)。

我确实找到了一个解决方法 - 显然从 D3D 堆栈切换并强制 OpenGL 堆栈(-Dsun.java2d.d3d=false启动时的选项)可以防止这种情况发生。我现在添加了一些代码来检查应用程序是否正在虚拟机上启动并相应地设置选项。

编辑
错误报告已被接受,尽管目前处于“无法重现”状态。http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8191018