Я наблюдаю какое-то странное поведение с 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, когда у него внезапно нет экрана для рисования?