2012-05-08 12 views
7

Actualmente estoy aprendiendo sobre actores en Scala. El libro recomienda usar el método react en lugar de receive, porque permite que el sistema use menos hilos.¿Es caro tener muchos hilos en una aplicación JVM?

He leído why creating a thread is expensive. Pero, ¿cuáles son las razones por las que, una vez que tienes los hilos (que deberían ser válidos para el sistema actor en Scala después de la inicialización), tenerlos cerca es caro?

¿Es principalmente el consumo de memoria? ¿O hay otras razones?

+0

Tenga en cuenta que esta pregunta se trata de la sobrecarga de hilos * después de * la creación, por lo que no es un duplicado de la pregunta vinculada. Lo cual ya está expresado en la pregunta ... – rolve

Respuesta

10

El uso de muchos hilos puede ser más caro que el que cabría esperar debido a que:

  • cada hilo consume memoria fuera del montón que sitúa a la restricción de la cantidad de hilos se pueden crear en absoluto para JVM;
  • cambiar de un hilo a otro consume algo de tiempo de CPU, por lo que si tiene actividad que se puede realizar en un solo hilo, ahorrará ciclos de CPU;
  • hay programador de JVM que tiene más trabajo por hacer si hay más subprocesos. Lo mismo se aplica al planificador de sistema operativo subyacente;
  • por último, tiene poco sentido utilizar más hilos que núcleos de CPU para tareas vinculadas a CPU y tiene poco sentido utilizar más hilos de E/S que las actividades de E/S (por ejemplo, clientes de red).
+4

podría valer la pena señalar que el comentario del "planificador JVM" implica que las pausas de su GC aumentarán en cierta medida (ya que lleva más tiempo llevar todos los hilos a un punto seguro), probablemente más notorio en las pausas gen jóvenes – Matt

+0

@Matt ese es un buen punto! ¡Gracias! –

2

Además de la sobrecarga de memoria de tener un hilo (que puede o no ser pequeño), tener más hilos alrededor también significará que el programa tendrá más elementos a considerar cuando llegue el momento de elegir qué hilo obtendrá la CPU siguiente.

Algunos sistemas operativos/JVM también pueden tener restricciones en la cantidad de subprocesos que pueden existir al mismo tiempo.

Eventualmente, se trata de una acumulación de pequeños gastos generales que eventualmente puede dar cuenta de un montón. Y nada de esto es realmente específico de Java.

2

Tener hilos alrededor no es "caro". Por supuesto, depende de cuántos de los que estamos hablando aquí. Sospecho que miles de millones de hilos serían un problema. Creo que hablando en general, tener muchos subprocesos se considera costoso porque se puede hacer más trabajo en paralelo para que la CPU suba, la memoria suba, etc. ... Pero si se administran correctamente (por ejemplo, para proteger los recursos del sistema), entonces está bien. La JVM no utiliza necesariamente subprocesos nativos, por lo que un subproceso de Java no se correlaciona necesariamente con un subproceso nativo del sistema operativo (es decir, si se consideran subprocesos verdes, por ejemplo, o subprocesos ligeros). En mi opinión, no hay un costo implícito para los hilos en la JVM. El costo proviene de la gestión deficiente de los hilos y el uso excesivo de los recursos asignándolos descuidadamente.

+1

Esa es la mejor explicación hasta el momento, por lo que +1. –

+0

Claro que es "caro". Utiliza memoria. Creo que el valor predeterminado es 1MB/hilo en la máquina de 64 bits. Entonces 1000 hilos => 1GB. Puede tener 32 GB y no le importa, pero "no es caro" es engañoso. –

Cuestiones relacionadas