Dudo que al construir una instancia de un subproceso o una subclase del mismo se escape la memoria. En primer lugar, no hay nada de los géneros mencionados en los Javadocs o en la Especificación del lenguaje Java. En segundo lugar, me encontré con una prueba simple y también muestra que no hay memoria se filtró (al menos no en el JDK de Sun 1.5.0_05 de 32-bit 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: Sólo para resumir la idea de la prueba anterior. Cada instancia de la subclase MyThread de un subproceso hace referencia a su propia matriz de 10 MB. Si las instancias de MyThread no se recogieron basura, la JVM se quedaría sin memoria muy rápidamente. Sin embargo, ejecutar el código de prueba muestra que la JVM está usando una pequeña cantidad de memoria constante, independientemente del número de MyThreads construidos hasta el momento. Reclamo que esto se debe a que las instancias de MyThread son basura.
¿Es este un problema que depende de la implementación (por ejemplo, de la JVM de Sun), o está resumido en alguna parte de la Especificación del lenguaje Java? – Alexander
Editado - Investigué un poco más y es un error de JVM – slim