Singletonクラスのアンロード

package gctest;
import java.net.*;
import java.lang.reflect.*;

public class Main {    
    
    public static void main(String args) throws Exception {
        Main m = new Main();
        m.test();
        System.gc();
    }
    
    private void test() throws Exception {
        URLClassLoader loader = 
			new URLClassLoader( new URL {new URL("file:/C:/work/"),});
        loader.loadClass("gctest2.Singleton");
        loader = null;
    }
	
}
C:\work\java\src>java -verbose:gc gctest.Main
[Full GC[Unloading class gctest2.Singleton]
 137K->90K(1984K), 0.0090436 secs]

C:\work\java\src>java -verbose:gc -Xnoclassgc gctest.Main
[Full GC 137K->92K(1984K), 0.0116012 secs]

クラスローダーがGCされればそのクラスローダーによってロードされたSingletonクラスもアンロードされる(-Xnoclassgcを指定すればアンロードされない)。そうなんだけど、これでは疑問が解決していなくて、ほんとうは、次のような(望ましくない)流れが実際に起きることがあるのを確かめたい。

  1. 最初のSingleton.getInstance()でクラスがロードされる
  2. Singletonクラスがアンロードされる
  3. Singleton.getInstance()で再びクラスがロードされる

で、Singleton.getInstance()みたいに静的にアクセスするときに特定のクラスローダーを使うっていうのはよくわからない。

課題:クラスローダーをちゃんと理解しましょう。