我在帖子https://stackoverflow.com/a/23934422/2194456
中看到过 class Test {
String s = "1";
}
...
MyClassLoader cl = new MyClassLoader();
Object obj = cl.loadClass("Test").newInstance();
obj = null;
cl = null;
// now "1" is eligible for GC if no other class or object references it
这真的有效吗?
答案 0 :(得分:1)
对于字符串文字进行GCed的唯一原因是,如果所有引用它的类都被卸载了。即使这样,特定的垃圾收集器也必须被设计为删除被拦截的字符串,而不是全部都是。
对于要卸载的类,必须使用用户类加载器加载,并且必须释放/卸载该加载器以及引用该类的所有对象和类。这绝不会偶然发生,并且很难达到目的。
(上面的代码尝试这样做,但是,正如我所说的那样,故意这样做很难,所以我不能说它是否有效。)
(并且,正如其他地方所提到的那样,GC语言的能力在语言历史中已经多次打开和关闭,很可能是某些当前JVM的启动选项。)