2013-06-08 3 views
3

я установил обычай ClassLoader отслеживать загруженные классы во время выполнения, чтобы поймать некоторые плохие реагирующие моменты, и я увидел, что некоторые классы GUI загружаются каждый раз, когда JFrame/JDialog создана:Почему JVM продолжает загружать одни и те же классы (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

+2

Вы также можете показать нам свой 'ClassLoader'? – jlordo

ответ

2

загружая класс UI это часть взгляда Свинг & чувствовать процесс инициализации см UIDefaults.getUI(...) для получения дополнительной информации

Если это не называется миллионы раз, loadClass (...) вряд ли будет вашей проблемой здесь: если класс уже загружен, он вернется очень быстро. Попробуйте использовать профилировщик, чтобы определить причину замедления.

+0

Но я инициализирую Look and Feel только один раз, в приложении main(). Приведенные классы образцов загружаются каждый раз при создании диалога. Во-вторых, это не только связанный с GUI, я приводил примеры классов, которые повторяются, когда я выполняю операции XML. –

+3

Вызов loadClass (...) не означает, что класс действительно загружен, первое, что загрузчик класса проверяет, был ли класс уже загружен и, если да, возвращает его. – Guillaume

+0

@Guillaume - ваш комментарий - это реальный ответ. – kdgregory