Java JDK 7/8和OpenSUSE 13.1中的Swing应用程序启动太慢

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

我在OracleJDK7/8和OpenSUSE13.1下开发swing应用程序时遇到了麻烦:与JDK6下运行的同一个应用程序相比,它们需要花费太多的时间来启动。 这是我的主要测试代码:

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