Я имею в виду этот пример кода, который сообщается в http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6254531
import java.net.URL;
class Loader {
public static void main(String[] args) throws Exception {
for (;;) {
System.gc();
System.out.print(".");
System.out.flush();
new java.net.URLClassLoader(
new URL[] { new java.io.File(".").toURL() },
ClassLoader.getSystemClassLoader().getParent()
).loadClass("Weakling").newInstance();
}
}
}
public class Weakling {
private static ThreadLocal<Object> local;
private static Weakling staticRef;
private Object var = new byte[1000*1000];
public Weakling() {
local = new ThreadLocal<Object>();
local.set(this);
staticRef = this;
}
@Override
protected void finalize() {
System.out.print("F");
System.out.flush();
}
}
Финализация никогда не будет вызываться. Однако, если я изменю
new java.net.URLClassLoader(
new URL[] { new java.io.File(".").toURL() },
ClassLoader.getSystemClassLoader().getParent()
).loadClass("Weakling").newInstance();
к
new Weakling();
Он работает очень хорошо и не обнаруживается утечка.
Может ли кто-нибудь объяснить, почему у объекта, созданного ClassLoader, нет возможности собирать мусор?