Подтвердить что ты не робот

Качание с использованием большого количества процессора при вызове перерисовки в минимизированном сеансе RDP

Я наблюдаю какое-то странное поведение с Java 8 (несколько версий, в частности 1.8.0_111) при запуске приложения Swing в виртуальной машине. VM - это машина Windows 10, работающая в VMware, с которой я работаю удаленно. Я не пытался делать это с помощью реального рабочего стола, а не виртуальной машины, но я планирую как можно скорее удалить дополнительную точку отказа.

Мне удалось воспроизвести его с помощью этой минимальной программы:

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();
    });
}

Теперь, если я просто запускаю его нормально, он перерисовывает, никаких проблем вообще, просто фрейм с тремя пустыми полями, как и ожидалось. Проблема возникает, если я минимизирую окно сеанса RDP. Если это произойдет (и кадр не был обозначен), тогда Swing начинает потреблять нездоровое количество CPU, пока я не открою окно RDP снова.

Я попытался свести к минимуму пример кода, тем не менее уменьшив счетчик combo-box до 2, удалив subpanel или установив таймер с одним огнем (вместо повторения, даже если перерисовка произойдет, когда RDP будет сведен к минимуму ) все это предотвратило ошибку.

Здесь используется график использования ЦП:
http://i67.tinypic.com/23rwglx.png

Я пробовал профилировать приложение во время этих шипов, чтобы попытаться посмотреть, что, черт возьми, происходит. Вот результат от профилировщика в JVisualVM:
http://i68.tinypic.com/apdwed.png

И сэмплер (после удаления фильтра пакетов):
http://i67.tinypic.com/2071735.png

Я не мог с готовностью понять, что можно было бы сесть в CPU в ProcessingRunnable. Есть ли у кого-нибудь опыт в том, что делает Swing, когда у него внезапно нет экрана для рисования?

4b9b3361

Ответ 1

Я разместил это как отчет об ошибке для Oracle. Я обновлю этот ответ, когда появятся какие-либо данные (они будут приняты или отклонены) со ссылкой.

Пара похожее bugs были уже отправлены с "Невозможно воспроизвести" в качестве разрешения, однако они не связаны с виртуальными машинами, а только сеансами RDP (я не смог запустить эту ошибку с помощью RDP для рабочего стола, а не для виртуальной машины).

Я нашел обходное решение - по-видимому, отключение от стека D3D и форсирование стека OpenGL (опция -Dsun.java2d.d3d=false при запуске) предотвращает это. Теперь я добавил код, чтобы проверить, запускается ли приложение на виртуальной машине и соответственно задает параметры.

ИЗМЕНИТЬ
Отчет об ошибке был принят, хотя на данный момент он не может воспроизводиться. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8191018