Java JDK 7/8和OpenSUSE 13.1中的Swing应用程序启动太慢
我在OracleJDK7/8和OpenSUSE13.1下开发swing应用程序时遇到了麻烦:与JDK6下运行的同一个应用程序相比,它们需要花费太多的时间来启动。 这是我的主要测试代码:Java JDK 7/8和OpenSUSE 13.1中的Swing应用程序启动太慢,java,swing,opensuse,Java,Swing,Opensuse,我在OracleJDK7/8和OpenSUSE13.1下开发swing应用程序时遇到了麻烦:与JDK6下运行的同一个应用程序相比,它们需要花费太多的时间来启动。 这是我的主要测试代码: final long start = System.currentTimeMillis(); try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } ca
final long start = System.currentTimeMillis();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("Set LAF. Milliseconds from start app: " + (System.currentTimeMillis() - start));
EventQueue.invokeLater(new Runnable() {
public void run() {
TestSwingJFrame frame = new TestSwingJFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Backup Utilities");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
System.out.println("Render app. Milliseconds from start app: " + (System.currentTimeMillis() - start));
}
});
TestSwingJFrame.java:(4个JLabel,2个JTextField,4个JButton,1个JTextArea,根本没有进程,只有UI元素)
瞧,这些代码在JDK 7/8下大约需要17秒来渲染。这是使用每个JDK编译和运行应用程序的结果:
// JDK 8u20
Set LAF. Milliseconds from start app: 17250
Render app. Milliseconds from start app: 17367
// JDK 7u51
Set LAF. Milliseconds from start app: 17271
Render app. Milliseconds from start app: 17375
// JDK 6u45
Set LAF. Milliseconds from start app: 668
Render app. Milliseconds from start app: 931
首先,我认为Nimbus LAF有问题,所以我删除了设置LAF的代码,但没有任何更改:
// JDK 8u20
Set LAF. Milliseconds from start app: 0
Render app. Milliseconds from start app: 17295
//JDK 7u51
Set LAF. Milliseconds from start app: 0
Render app. Milliseconds from start app: 17263
// JDK 6u45
Set LAF. Milliseconds from start app: 0
Render app. Milliseconds from start app: 245
经过一点调试,我发现应用程序的大部分启动时间(没有设置LAF)都在这一行:
frame.setVisible(true);
我尝试过其他Oracle JDK(7u60、7u65)和默认的开放JDK(7u51),但一点运气都没有。在谷歌周围搜索没有结果。17秒来启动一个简单的swing应用程序真是让人难以忍受。有人能帮我解开这个谜吗
编辑1:我用Lubuntu、Windows XP和Windows 7进行了其他测试:
// Lubuntu - JDK 7u10
Set LAF. Milliseconds from start app: 265
Render app. Milliseconds from start app: 392
// Windows XP SP2 - JDK 7u67
Set LAF. Milliseconds from start app: 100
Render app. Milliseconds from start app: 280
//Windows XP SP2 - JDK 7u65
Set LAF. Milliseconds from start app: 562
Render app. Milliseconds from start app: 1061
因此,问题可能在于OpenSUSE 13.1与JDK 7/8兼容
编辑2:根据AlexR的建议,使用Eclipse,我在Java代码中进行了进一步调试,发现此类的方法占用了大部分时间:
Container.validateTree()
但是如果没有日志记录,就不可能进一步挖掘,因为这是一种递归方法。最好的方法是调试并跳转到
setVisible
中,看看新的JVM是否事先做了什么。还要检查(可能)新的java虚拟机是否在磁盘上是碎片化的,以便加载需要更多的磁盘时间。你说OpenSuse-你确定是Oracle JDK而不是通过IcedTea的OpenJDK吗?这不完全一样。@Gimby-是的,我确定我使用哪个JDK编译和运行。我已经将它们全部添加到Eclipse中已安装的JRE列表中,以比较每个JDK.Eclipse?你哪里都没提到日食。@Gimby-对不起,我忘了提它了。但我认为这没有什么区别,因为我导出的可运行JAR文件需要相同的时间以java命令启动。
Container.validateTree()