Я сомневаюсь, что создание экземпляра Thread или его подкласса приводит к утечке памяти. Во-первых, нет ничего такого, что упоминается в Javadocs или в спецификации языка Java. Во-вторых, я выполнил простой тест, и он также показывает, что нет утечки памяти (по крайней мере, на JDK Sun 1.5.0_05 на 32-битной x86 Linux 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(".");
}
}
}
РЕДАКТИРОВАТЬ: Просто чтобы подвести итог идеи теста выше. Каждый экземпляр подкласса MyThread потока ссылается на свой собственный массив размером 10 МБ. Если бы экземпляры MyThread не собирались мусором, JVM не хватало бы памяти достаточно быстро. Однако выполнение тестового кода показывает, что JVM использует небольшой постоянный объем памяти независимо от количества созданных MyThreads. Я утверждаю, что это потому, что экземпляры MyThread собирают мусор.