为什么JVM会在每次实例化时一次又一次地加载相同的(GUI)类?

时间:2013-06-08 18:44:43

标签: java swing jvm classloader uimanager

我安装了自定义ClassLoader来跟踪运行时加载的类,以捕获一些不良的响应时刻,我看到每次创建JFrame / JDialog时都会加载一些GUI类:

loading: com.sun.java.swing.plaf.windows.WindowsPopupMenuSeparatorUI
loading: com.sun.java.swing.plaf.windows.WindowsTextFieldUI
loading: com.sun.java.swing.plaf.windows.WindowsTextAreaUI
loading: com.sun.java.swing.plaf.windows.WindowsComboBoxUI
loading: com.sun.java.swing.plaf.windows.WindowsPasswordFieldUI

为什么ClassLoader会在每次单个对话框实例化时加载这些类,而不仅仅是一次?

另一个例子:

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
com.sun.org.apache.xerces.internal.impl.dv.dtd.DTDDVFactoryImpl

我的简单ClassLoader

public class MyClassLoader extends ClassLoader {

    public MyClassLoader ( ClassLoader parent ) {
        super( parent );
    }

    @Override
    public Class<?> loadClass( String name ) throws ClassNotFoundException {
        System.out.println( "loading: " + name );
        return super.loadClass( name );
    }
}

JVM参数:-Djava.system.class.loader=mupackage.MyClassLoader

1 个答案:

答案 0 :(得分:2)

将UI类加载到Swing的外观和感觉初始化过程中,有关详细信息,请参阅UIDefaults.getUI(...)

除非被调用数百万次,否则loadClass(...)不太可能成为你的问题:如果已经加载了类,它将返回非常快。尝试使用分析器来查明减速的原因