2009-09-29 16 views
12

¿Cuál es el "costo" bruto de usar hilos en java? ¿Existe alguna regla general/valores empíricos? ¿Cuánta memoria cuesta la creación de un hilo? ¿Hay una estimación aproximada de cuántos ciclos de CPU cuesta crear un hilo?¿Cuál es el "costo" aproximado de un subproceso en ciclos de CPU y memoria?

Contexto: En un servlet de una aplicación web quiero paralelizar la creación de contenido ya que partes del contenido están basadas en archivos, basadas en bases de datos y en servicios web. Pero esto significaría que por cada "http-request-thread" (de mi contenedor serlvet) tendré dos o cuatro hilos adicionales. Tenga en cuenta que voy a utilizar el ExecutorService en Java 6.

¿Qué debo esperar cuando uso cientos a miles de subprocesos de Java en un servidor web?

Respuesta

13

Cada hilo tiene su propia pila, y en consecuencia hay un impacto inmediato en la memoria. El tamaño predeterminado de la pila de subprocesos es, IIRC, para Java 6, 512k (diferentes JVM/versiones posiblemente tendrán diferentes valores predeterminados). Esta figura es ajustable usando la opción -Xss. En consecuencia, el uso de cientos de subprocesos tendrá un impacto en la memoria que consume la VM (muy posiblemente antes de cualquier impacto en la CPU a menos que esos subprocesos se estén ejecutando).

He visto a clientes encontrarse con problemas relacionados con hilos/memoria, ya que no es un enlace obvio. Es trivial crear 100,000 hilos (usando ejecutores/pools, etc.) y los problemas de memoria no parecen ser inmediatamente atribuibles a esto.

Si está dando servicio a muchos clientes, es posible que desee echar un vistazo a la API de Java NIO y, en particular, a multiplexing, que permite la programación de red asíncrona. Eso le permitirá manejar muchos clientes con un solo hilo y, en consecuencia, reducir su necesidad de una gran cantidad de hilos.

1

Eso depende: depende del sistema operativo, la versión de Java y la CPU. La única manera de resolver esto es probarlo y medir los resultados.

Dado que utilizará el ExecutorService, será fácil controlar el número de subprocesos. No use muy pocos o las solicitudes se acumularán. Si usa demasiados, se encontrará con problemas de rendimiento con su sistema de archivos y la base de datos mucho antes de que Java se quede sin hilos.

Cuestiones relacionadas