sincronizacion - No se pueden obtener 2542 hilos en Java en 4 GB iMac OSX 10.6.3 Snow Leopard(32 bits)
thread java (4)
Estoy ejecutando el siguiente programa tratando de descubrir cómo configurar mi JVM para obtener la mayor cantidad de subprocesos que mi máquina puede admitir. Para aquellos que quizás no lo sepan, Snow Leopard se envía con Java 6.
Intenté comenzar con los valores predeterminados, y las siguientes líneas de comando, siempre obtengo el error de falta de memoria en el subproceso 2542, sin importar en qué se establezcan las opciones de JVM.
java TestThreadStackSizes 100000
java -Xss1024 TestThreadStackSizes 100000
java -Xmx128m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xms2048m -Xss1024 TestThreadStackSizes 100000
pase lo que pase, obtengo los mismos resultados, Error de falta de memoria en 2542
public class TestThreadStackSizes
{
public static void main(final String[] args)
{
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(final Thread t, final Throwable e)
{
System.err.println(e.getMessage());
System.exit(1);
}
});
int numThreads = 1000;
if (args.length == 1)
{
numThreads = Integer.parseInt(args[0]);
}
for (int i = 0; i < numThreads; i++)
{
try
{
Thread t = new Thread(new SleeperThread(i));
t.start();
}
catch (final OutOfMemoryError e)
{
throw new RuntimeException(String.format("Out of Memory Error on Thread %d", i), e);
}
}
}
private static class SleeperThread implements Runnable
{
private final int i;
private SleeperThread(final int i)
{
this.i = i;
}
public void run()
{
try
{
System.out.format("Thread %d about to sleep/n", this.i);
Thread.sleep(1000 * 60 * 60);
}
catch (final InterruptedException e)
{
throw new RuntimeException(e);
}
}
}
}
¿Alguna idea sobre cómo puedo afectar estos resultados?
Escribí este programa para descubrir de lo que es capaz Windows Server 2003, porque estoy obteniendo estos out of memory can''t create native threads
en números muy bajos, como un par de cientos. Necesito ver qué era una caja particular capaz con diferentes parámetros -Xss
, luego me encontré con este límite arbitrario en OSX.
De acuerdo con el documento del desarrollador de Apple, el tamaño de la pila de subprocesos debe ser de al menos 64 K, por lo que se ignora su -Xss 1014. Pero incluso con 64K por subproceso, el consumo de memoria de la pila de subprocesos solo llega a unos 160 MB, por lo que este no debería ser el problema. Los subprocesos también podrían consumir memoria de un grupo más limitado, o simplemente podría haber un límite en la cantidad de subprocesos que puede tener por proceso o usuario.
Debe averiguar la cantidad máxima de subprocesos que admite el sistema operativo en su sistema.
En Linux, puedes hacer algo como:
cat /proc/sys/kernel/threads-max
para obtener el máximo, y para configurarlo puedes hacer algo como:
echo 10000 > /proc/sys/kernel/threads-max
También intente ejecutar con:
-XX:-UseBoundThreads
e informa los resultados.
¿Crees que tendrás estos hilos al mismo tiempo hasta 1 hora? No lo creo. He trabajado en una aplicación que procesó cientos de documentos, los convirtió desde y hacia diff. formato, genera registros adecuados en DB y también almacena información específica. Luego también terminó en segundos.
Lo que debe cuidarse es codificar sabiamente para evitar hacer demasiados hilos. En su lugar, use un ThreadPool
proporcionado por Java, para que los mismos hilos se puedan utilizar cuando sea necesario. eso proporcionará un mejor rendimiento. También mantenga la sincronización en bloques mínimos para evitar cuellos de botella en su ejecución.
Gracias.
2542 parece un número arbitrario:
Apagué todos los programas excepto la ventana de una terminal desde la que ejecutaba mi prueba y llegué a 2545
, que me dijo que era un límite arbitrario.
Para obtener la cantidad de subprocesos para OSX 10.6.3, haga lo siguiente:
> sysctl kern.num_threads
kern.num_threads: 2560
y
> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560
El número 2560
coincide con el 2542
y el 2545
porque obviamente hay otros subprocesos ejecutándose en segundo plano. De acuerdo con la documentación oficial, kern.num_taskthreads
no se puede ajustar en la versión de escritorio de OSX.