Java.Lang.OutOfMemoryError: no se puede crear un nuevo subproceso nativo

Suraj P 12 octubre 2023
  1. No se puede crear un nuevo error de subproceso nativo en Java
  2. Cómo resolver el java.lang.OutOfMemoryError: no se puede crear un nuevo hilo nativo
  3. Conclusión
Java.Lang.OutOfMemoryError: no se puede crear un nuevo subproceso nativo

En este artículo, aprenderemos sobre el error java.lang.OutOfMemoryError: no se puede crear un nuevo subproceso nativo en Java.

No se puede crear un nuevo error de subproceso nativo en Java

La mayoría de las aplicaciones del mundo real creadas en Java tienen múltiples subprocesos por naturaleza, con muchos componentes que realizan diferentes tareas. Estas tareas se ejecutan en diferentes subprocesos para mejorar el rendimiento. Pero la cantidad máxima de subprocesos que la aplicación Java puede crear depende del sistema operativo (SO) que estemos usando.

Por lo tanto, el error no se puede crear un nuevo subproceso nativo lo genera Java Virtual Machine (JVM) cada vez que el sistema operativo no puede crear nuevos subprocesos del kernel, también conocidos como subprocesos del sistema o del sistema operativo.

Los siguientes eventos ocurren en el backend, lo que conduce a este error:

  1. El programa/aplicación dentro de la JVM solicita al sistema operativo un nuevo subproceso.
  2. Se envía una solicitud al sistema operativo para crear un nuevo subproceso del kernel mediante el código nativo de JVM.
  3. El sistema operativo intenta crear un nuevo subproceso que implica el paso de asignación de memoria.
  4. El sistema operativo no puede asignar la memoria porque el sistema operativo agotó la memoria virtual o la aplicación Java solicitante agotó el espacio de direcciones de la memoria.
  5. La JVM arroja el error no se puede crear un nuevo subproceso nativo.

Veamos un ejemplo para entenderlo mejor.

import java.util.concurrent.TimeUnit;

public class Test {
  public static void main(String[] args) {
    while (true) {
      new Thread(() -> {
        try {
          TimeUnit.HOURS.sleep(1);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }).start();
    }
  }
}

En el código anterior, creamos subprocesos continuamente usando un bucle infinito y los hacemos esperar, pero dado que creamos continuamente mientras retenemos los subprocesos durante una hora, pronto alcanzaremos la cantidad máxima de subprocesos permitidos por el sistema operativo.

Cómo resolver el java.lang.OutOfMemoryError: no se puede crear un nuevo hilo nativo

Ahora, ¿cómo resolver este error, o tenemos alguna solución aquí?

Una solución es cambiar la configuración a nivel del sistema operativo para aumentar la cantidad de subprocesos permitidos, pero esta solución no es factible por dos razones.

  1. En primer lugar, no es fácil reconfigurar las cosas a nivel del sistema operativo y tampoco se recomienda.
  2. En segundo lugar, la mayoría de las veces no tiene nada que ver con el límite de subprocesos del sistema operativo; el error se da porque tenemos algún error de programación; por ejemplo, en el programa escrito anteriormente, estamos creando continuamente utilizando un ciclo infinito que no es una forma ideal.

Otra solución, o más, es usar el marco ExecutorService para limitar la cantidad de subprocesos en un grupo de subprocesos que se pueden manejar en un momento dado.

Ejemplo:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class Test {
  public static void main(String[] args) {
    ExecutorService es = Executors.newFixedThreadPool(10);

    Runnable tasks = () -> {
      try {
        TimeUnit.HOURS.sleep(1);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    };

    IntStream.rangeClosed(1, 15).forEach(x -> es.submit(tasks));
  }
}

En el código, hemos creado un grupo de subprocesos de tamaño fijo que puede tener un máximo de 10 subprocesos y luego creamos una tarea Ejecutable que hace que los subprocesos esperen una hora.

Usando IntStream, enviamos 15 tareas al grupo de subprocesos, por lo que se enviarán 10 mientras que las 5 restantes estarán en la cola ExecutorService.

Conclusión

En este artículo, aprendimos que el error no se puede crear un nuevo subproceso nativo en Java ocurre cuando el sistema operativo no puede crear nuevos subprocesos del kernel. También buscamos una solución o solución alternativa usando el marco ExecutorService.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

Artículo relacionado - Java Error