que estoy experimentando un problema en una máquina de prueba que ejecuta Red Hat Linux (versión del núcleo es 2.4.21-37.ELsmp) usando Java 1.6 (1.6.0_02 o 1.6.0_04) El problema es que, una vez que se crea un cierto número de subprocesos en un solo grupo de subprocesos, el sistema operativo no quiere o no puede crear más.baja Java proceso único límite de la rosca en Red Hat Linux
Esto parece ser específica para Java creando hilos, como el programa de C thread-límite fue capaz de crear sobre 1.5k hilos. Además, esto no ocurre con Java 1.4 JVM ... puede crear más de 1.4k hilos, aunque obviamente se manejan de forma diferente con respecto al sistema operativo.
En este caso, el número de hilos que está cortando a es un mero 29 hilos. Esto se puede probar con un programa Java simple que solo crea subprocesos hasta que obtiene un error y luego imprime la cantidad de subprocesos que creó. El error es un
java.lang.OutOfMemoryError: unable to create new native thread
Esto parece ser afectada por cosas tales como el número de hilos en uso por otros procesos o usuarios o la cantidad total de memoria que el sistema está utilizando en ese momento. Las configuraciones de JVM como Xms, Xmx y Xss tampoco parecen cambiar nada (lo que se espera, considerando que el problema parece ser la creación de hilos del sistema operativo nativo).
La salida de "ulimit -a" es el siguiente: no parece límite proceso
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) 4 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 7168 virtual memory (kbytes, -v) unlimited
El usuario a ser el problema. La búsqueda de información sobre lo que podría estar equivocado no ha aparecido mucho, pero this post parece indicar que al menos algunos núcleos de Red Hat limitan un proceso de 300 MB de memoria asignada a la pila, y al 10 MB por hilo de pila, parece que el problema podría estar allí (aunque parece extraño y poco probable también).
He intentado cambiar el tamaño de la pila con "ulimit -s" para probar esto, pero cualquier valor distinto de 10240 y la JVM no comienza con un error de:
Error occurred during initialization of VM Cannot create VM thread. Out of system resources.
general puedo conseguir alrededor de Linux, pero realmente no sé mucho sobre la configuración del sistema, y no he podido encontrar nada que aborde específicamente este tipo de situación. Cualquier idea sobre qué sistema o configuración de JVM podría estar causando esto sería apreciada.
Ediciones: Ejecutando el programa de límite de hilos mencionado por plinth, no hubo falla hasta que intentó crear el subproceso 1529th.
El problema tampoco ocurrió con una JVM 1.4 (ocurre con las JVM 1.6.0_02 y 1.6.0_04, no se puede probar con una JVM 1.5 en este momento).
El código para la prueba de hilo que estoy usando es el siguiente:
public class ThreadTest {
public static void main(String[] pArgs) throws Exception {
try {
// keep spawning new threads forever
while (true) {
new TestThread().start();
}
}
// when out of memory error is reached, print out the number of
// successful threads spawned and exit
catch (OutOfMemoryError e) {
System.out.println(TestThread.CREATE_COUNT);
System.exit(-1);
}
}
static class TestThread extends Thread {
private static int CREATE_COUNT = 0;
public TestThread() {
CREATE_COUNT++;
}
// make the thread wait for eternity after being spawned
public void run() {
try {
sleep(Integer.MAX_VALUE);
}
// even if there is an interruption, dont do anything
catch (InterruptedException e) {
}
}
}
}
Si ejecuta esto con una JVM 1.4 ya que colgará cuando no puede crear más hilos y requieren una matanza - 9 (al menos lo hizo por mí).
Más Editar:
Resulta que el sistema que está teniendo el problema está utilizando los hilos de Linux Modelo de subprocesos mientras que otro sistema que funciona bien está utilizando el modelo NTPL.
sólo una pequeña nota al margen de todos los nuevos querer-a-ser programadores: nunca utilice 'while (true)' en cualquier lugar excepto para proyectos escolares y la experimentación privada y _Nunca_ crear miles de hilos, su aplicación más probable es que tiene errores serios si lo hace, o si no, el diseño de su aplicación es defectuoso. Solo digo ... – specializt