No se pueden obtener 2542 hilos en Java en 4 GB iMac OSX 10.6.3 Snow Leopard (32 bits)

Estoy ejecutando el siguiente progtwig tratando de encontrar la manera de configurar mi JVM para obtener la mayor cantidad de subprocesos que puede admitir mi máquina. 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, independientemente de las opciones de JVM configuradas.

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 progtwig 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.

2542 parece un número arbitrario:

Apagué todos los progtwigs 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.

De acuerdo con el documento del desarrollador de Apple, el tamaño de la stack 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 stack 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 el número de subprocesos que puede tener por proceso o usuario.

¿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, utilice 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.

Debe averiguar la cantidad máxima de subprocesos que el sistema operativo admite 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.