2010-04-01 9 views
2

Lorsqu'un classloader est récupéré, les classes chargées par lui sont-elles déchargées? Lorsque la JVM est en cours d'exécution est en mode verbeux, toutes les classes chargées sont o/p. De même, la JVM se connectera-t-elle lorsqu'elle déchargera une classe?Déchargement de classe en Java

J'ai écrit un chargeur de classe personnalisé pour le tester, mais je n'ai pas pu voir de journal détaillé pour le déchargement des classes.

CustomClassLoader loader = new CustomClassLoader(new URL[]{}, CustomClassLoader.class.getClassLoader()); 
    loader.addURL("D:\\workspace\\ClassLoaderTest\\implementation.jar"); 

    Class c = null; 
    try { 
     c = Class.forName("Horse",false,loader); 
     if (c != null) { 
      try { 
       Animal animal = (Animal)c.newInstance(); 
       animal.eat(); 
      } 
      catch(Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
      c = null; 
    loader = null; 
    byte[] b = new byte[58*1024*1024]; 
    System.gc(); 
    ClassLoadingMXBean clBean = ManagementFactory.getClassLoadingMXBean(); 
    System.out.println("Number of classes currently loaded " + clBean.getLoadedClassCount()); 
    System.out.println("Number of classes loaded totally " + clBean.getTotalLoadedClassCount()); 
    System.out.println("Number of classes unloaded " + clBean.getUnloadedClassCount()); 

Même le ClassLoadingMXBean donne nombre de classes débarquées comme 0.

Comment puis-je savoir qu'une classe est déchargée lorsque le chargeur de classe est GCed?

Répondre

5

Un classloader ne sera pas collecté pendant que les classes créées pour lui sont "live" - ​​en partie car vous pouvez demander à la classe son classloader.