¿Cómo hace Java el uso de múltiples núcleos?

Una JVM se ejecuta en un único proceso y los hilos en una JVM comparten el montón que pertenece a ese proceso. Entonces, ¿cómo utiliza JVM múltiples núcleos que proporcionan múltiples subprocesos del sistema operativo para alta concurrencia?

Puede hacer uso de múltiples núcleos usando múltiples hilos. Pero usar una mayor cantidad de hilos que la cantidad de núcleos presentes en una máquina puede ser simplemente un desperdicio de recursos. Puede usar availableProcessors () para obtener la cantidad de núcleos.

En Java 7 hay un marco fork / join para hacer uso de múltiples núcleos.

Preguntas relacionadas:

  • ¿Se requiere Algoritmo Multi-Threaded para hacer uso de procesadores Multi-core?
  • Hilos por procesador
  • Correctamente multiproceso quicksort o mergesort algo en Java?

Los subprocesos verdes fueron reemplazados por subprocesos nativos en Java 1.2.

Java se beneficiará de múltiples núcleos, si el sistema operativo distribuye hilos sobre los procesadores disponibles. JVM en sí no hace nada especial para que sus hilos se programen de manera uniforme en múltiples núcleos. Un par de cosas a tener en cuenta:

  • Al implementar algoritmos paralelos, podría ser mejor generar tantos hilos como núcleos. ( Runtime.getRuntime().availableProcessors() ). No más, no menos.
  • Haga uso de las instalaciones proporcionadas por el paquete java.util.concurrent .
  • Asegúrese de tener Java Concurrency in Practice en su biblioteca personal.

Un montón de buenas respuestas aquí, pero pensé en agregar algunos más detalles para la posteridad.

Una JVM se ejecuta en un único proceso y los hilos en una JVM comparten el montón que pertenece a ese proceso. Entonces, ¿cómo utiliza JVM múltiples núcleos que proporcionan múltiples subprocesos del sistema operativo para alta concurrencia?

Como lo mencionaron otros, Java utilizará los subprocesos subyacentes del sistema operativo para realizar el trabajo real de ejecutar el código en diferentes CPU, si se ejecuta en una máquina con varias CPU. Cuando se inicia un hilo Java, crea un hilo del sistema operativo asociado y el sistema operativo es responsable de la progtwigción, etc. La JVM segura hace un poco de gestión y seguimiento del hilo y construcciones de lenguaje Java como volatile , synchronized , notify() , wait() , etc. todos afectan el estado de ejecución del subproceso del sistema operativo.

Una JVM se ejecuta en un único proceso y los hilos en una JVM comparten el montón que pertenece a ese proceso.

JVM no necesita “ejecutar en un solo proceso” porque incluso el recolector de elementos no utilizados y otros códigos JVM se ejecutan en diferentes subprocesos y el SO a menudo representa estos subprocesos diferentes como procesos diferentes. En Linux, por ejemplo, el único proceso que se ve en la lista de procesos suele enmascarar un montón de procesos de subprocesos diferentes. Esto es así incluso si está en una máquina de núcleo único.

Sin embargo, tiene razón en que todos comparten el mismo espacio de almacenamiento dynamic. En realidad, comparten el mismo espacio de memoria completo, lo que significa código, cadenas internas, espacio de stack, etc.

Entonces, ¿cómo utiliza JVM múltiples núcleos que proporcionan múltiples subprocesos del sistema operativo para alta concurrencia?

Los hilos obtienen sus mejoras de rendimiento por un par de razones. Obviamente, la concurrencia directa hace que el progtwig se ejecute más rápido. Ser capaz de realizar múltiples tareas de CPU al mismo tiempo (aunque no siempre) puede mejorar el rendimiento de la aplicación. También puede aislar las operaciones de E / S en un solo subproceso, lo que significa que se pueden ejecutar otros subprocesos mientras un subproceso está esperando en E / S (lectura / escritura en disco / red, etc.).

Pero en términos de memoria, los subprocesos obtienen muchas de sus mejoras de rendimiento debido a la memoria local en caché por CPU. Cuando un subproceso se ejecuta en una CPU, la memoria caché de memoria local de alta velocidad para la CPU ayuda a que la secuencia aisle las solicitudes de almacenamiento localmente sin tener que perder tiempo leyendo o escribiendo en la memoria central. Esta es la razón por la cual volatile llamadas volatile y synchronized incluyen construcciones de sincronización de memoria porque la memoria caché debe ser eliminada de la memoria principal o invalidada cuando los hilos necesitan coordinar su trabajo o comunicarse entre sí.