Wątpię, aby konstrukcja instancji wątku lub jego podklasy spowodowała wyciek pamięci. Po pierwsze, nic nie jest wymienione w Javadocs lub specyfikacji języka Java. Po drugie, wpadłem prosty test i to również pokazuje, że nie wyciekły pamięci (przynajmniej nie na Sun JDK 1.5.0_05 na 32-bitowym systemie Linux x86 2.6):
public final class Test {
public static final void main(String[] params) throws Exception {
final Runtime rt = Runtime.getRuntime();
long i = 0;
while(true) {
new MyThread().run();
i++;
if ((i % 100) == 0) {
System.out.println((i/100) + ": " + (rt.freeMemory()/1024/1024) + " " + (rt.totalMemory()/1024/1024));
}
}
}
static class MyThread extends Thread {
private final byte[] tmp = new byte[10 * 1024 * 1024];
public void run() {
System.out.print(".");
}
}
}
EDIT: Żeby podsumować ideę powyższy test. Każde wystąpienie podklasy MyThread wątku odwołuje się do własnej tablicy 10 MB. Jeśli instancje MyThread nie zostały zebrane, JVM bardzo szybko zabraknie pamięci. Jednak uruchomienie kodu testowego pokazuje, że JVM używa małej stałej ilości pamięci niezależnie od liczby skonstruowanych do tej pory MyThreads. Twierdzę, że dzieje się tak, ponieważ instancje MyThread są zbierane na śmieci.
Czy jest to kwestia zależna od implementacji (powiedzmy, JVM firmy Sun), czy jest ona opisana gdzieś w specyfikacji języka Java? – Alexander
Edytowany - Zrobiłem więcej badań i jest to błąd JVM – slim