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を指定すればアンロードされない)。そうなんだけど、これでは疑問が解決していなくて、ほんとうは、次のような(望ましくない)流れが実際に起きることがあるのを確かめたい。
- 最初のSingleton.getInstance()でクラスがロードされる
- Singletonクラスがアンロードされる
- Singleton.getInstance()で再びクラスがロードされる
で、Singleton.getInstance()みたいに静的にアクセスするときに特定のクラスローダーを使うっていうのはよくわからない。
課題:クラスローダーをちゃんと理解しましょう。