McGoverntheory hizo esta pregunta en Stackoverflow:
¿Cuántos hilos admite una máquina virtual Java como máximo? ¿Está relacionado con los desarrolladores de máquinas virtuales? ¿Qué pasa con el sistema operativo? ¿Hay otros factores?
Respuesta de Eddie:
Depende de la CPU que esté utilizando, el sistema operativo, lo que están haciendo otros procesos, la versión de Java que está utilizando y otros factores. He visto un servidor de Windows con más de 6500 hilos antes de que se caiga. Por supuesto, la mayoría de los hilos no hacen nada. Una vez que haya casi 6500 hilos (en Java) en una máquina, la máquina comenzará a tener problemas y se volverá inestable.
En mi experiencia, los hilos contenidos en el JVM se correlacionan positivamente con el rendimiento de la computadora en sí.
Por supuesto, debe tener suficiente memoria nativa y asignar suficiente memoria a Java para que cada hilo pueda tener una pila (pila de máquinas virtuales) y pueda hacer lo que desee. Cualquier máquina con una CPU moderna (AMD o las recientes generaciones de Intel) y 1-2 g de memoria (dependiendo del sistema operativo) puede soportar fácilmente una máquina virtual Java con miles de hilos.
Si necesita una respuesta más precisa, es mejor hacer una prueba de estrés usted mismo.
Respuesta de Charlie Martin:
Hay muchos parámetros (se pueden establecer). Para máquinas virtuales específicas, tendrán sus propios parámetros de tiempo de ejecución. (Número máximo de subprocesos) Hasta cierto punto, el sistema operativo lo determina: ¿Qué soporte debe proporcionar el sistema operativo subyacente a los subprocesos? ¿Qué restricciones se imponen? ¿La máquina virtual usa el hilo del sistema operativo nativo, o hilo rojo o hilo verde?
El soporte proporcionado por el sistema operativo es otro problema. Si escribe un programa Java como este:
La copia del código es la siguiente:
clase Dielikeadog {
public static void main (string [] argv) {
para(;;){
nuevo hilo (nuevo somerunaable) .Start ();
}
}
}
(No se queje de los detalles de la sintaxis, esto recién está comenzando), entonces, por supuesto, desea obtener cientos de hilos en ejecución. Sin embargo, el costo de crear un hilo es relativamente alto, y la sobrecarga de la programación (demasiados hilos) se vuelve prominente. Todavía es incierto si estos hilos pueden hacer cosas útiles.
Versión actualizada
Ok, ¡no puedo esperar! Aquí hay un pequeño programa de prueba que ha sido ligeramente pulido:
Copie el código de la siguiente manera: Public Class Dielikeadog {
Objeto estático privado s = nuevo objeto ();
private static int count = 0;
public static void main (string [] argv) {
para(;;){
nuevo hilo (nuevo runnable () {
public void run () {
sincronizado (s) {
recuento += 1;
System.err.println ("New Thread #"+Count);
}
para(;;){
intentar {
Thread.sleep (1000);
} Catch (Exception e) {
System.err.println (e);
}
}
}
}).comenzar();
}
}
}
En el sistema OS/X 10.5.6 de Intel, la salida de Java 5 es la siguiente:
La copia del código es la siguiente:
Nuevo hilo #2547
Nuevo hilo #2548
Nuevo hilo #2549
No puedo crear hilo: 5
Nuevo hilo #2550
Excepción en el hilo "Main" Java.lang.OUTOFMemoryError: No se puede crear un nuevo hilo nativo
en java.lang.thread.start0 (método nativo)
en java.lang.thread.start (Thread.java:592)
en Dielikeadog.Main (Dielikeadog.java:6)
Respuesta de Benjismith:
Después de leer la respuesta de Charlie Martin, me preguntaba si el tamaño de la memoria del montón puede marcar una diferencia en el número de hilos creados, y luego me sorprendió el resultado: en el sistema Vista Home Premium SP1, usando JDK 1.6.0_11, Establezca el tamaño de la memoria del montón de 2m a 1024m para ejecutar el programa de prueba de Charlie. Por ejemplo: para crear la memoria de Heap 2M, los parámetros de la máquina virtual que uso son: -xms2m -xmx2m.
Aquí están los resultados de mis pruebas:
Copie el código de la siguiente manera: 2 MB -> 5744 hilos
4 MB -> 5743 hilos
8 MB -> 5735 hilos
12 MB -> 5724 hilos
16 MB -> 5712 hilos
24 MB -> 5687 hilos
32 MB -> 5662 hilos
48 MB -> 5610 hilos
64 MB -> 5561 hilos
96 MB -> 5457 hilos
128 MB -> 5357 hilos
192 MB -> 5190 hilos
256 MB -> 5014 hilos
384 MB -> 4606 hilos
512 MB -> 4202 hilos
768 MB -> 3388 hilos
1024 MB -> 2583 hilos
Entonces, el tamaño del montón es realmente importante. Sin embargo, el tamaño del montón y el número máximo de hilos son inversamente proporcionales.
¡Esto es tan extraño!
Respuesta de Neil Coffey:
El número máximo teórico absoluto de subprocesos es el espacio de direcciones de usuario del proceso dividido por el tamaño de la pila de subprocesos (en realidad, si la pila de subprocesos utiliza toda la memoria, no habrá ningún programa que pueda ejecutarse). Por lo tanto, tomando el sistema de Windows de 32 bits como ejemplo, el espacio de dirección de usuario de cada proceso es 2G. . En realidad en el sistema XP, descubrí que se pueden iniciar unos 13,000 hilos.
Entonces, creo que su pregunta es esencialmente: (a) si puede administrar de manera efectiva muchos hilos en su código y no dejar que lo haga obviamente es estúpido (como: dejarlos en el mismo objeto de objeto (b) si el sistema operativo puede Manee efectivamente estos muchos hilos. Básicamente, si (a) la respuesta es "sí", la respuesta de la respuesta (b) es "sí".
Casualmente, puede configurar el tamaño de la pila de subprocesos en el constructor de subprocesos, pero no necesita y no debe confundir esto con los parámetros de la máquina virtual.