Je doute que la construction d'une instance d'un Thread ou d'une sous-classe de celui-ci fuit la mémoire. Tout d'abord, il n'y a rien des sortes mentionnées dans les Javadocs ou les spécifications de langage Java. En second lieu, j'ai couru un test simple et il montre aussi que pas de mémoire est une fuite (au moins pas de Sun JDK 1.5.0_05 sur 32 bits 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(".");
}
}
}
EDIT: Pour résumer l'idée de le test ci-dessus. Chaque instance de la sous-classe MyThread d'un Thread fait référence à son propre tableau de 10 Mo. Si les instances de MyThread n'étaient pas récupérées, la JVM manquerait de mémoire assez rapidement. Cependant, l'exécution du code de test indique que la machine virtuelle Java utilise une petite quantité constante de mémoire, quel que soit le nombre de MyThreads construits jusqu'à présent. Je prétends que c'est parce que les instances de MyThread sont récupérées par les ordures.
S'agit-il d'un problème lié à l'implémentation (par exemple, de la JVM de Sun) ou est-il décrit quelque part dans la spécification de langage Java? – Alexander
Modifié - J'ai fait un peu plus d'enquête et c'est un bug de la JVM – slim