5. No se puede crear un nuevo hilo nativo

5.1 No se puede crear un nuevo hilo nativo

Las aplicaciones de Java son generalmente de subprocesos múltiples. Esto significa que un programa escrito en Java puede (aparentemente) hacer varias cosas al mismo tiempo. Por ejemplo, incluso si la máquina tiene un solo procesador, cuando arrastra contenido de una ventana a otra, La reproducción de una película de fondo no se detendrá porque esté haciendo varias cosas a la vez.

Una forma de pensar en los subprocesos es pensar en ellos como trabajadores que pueden enviar tareas. Si solo tiene un trabajador, solo puede realizar una tarea a la vez. Pero cuando tiene una docena de trabajadores a su disposición, pueden todo se haga al mismo tiempo Algunas de sus solicitudes.

Ahora, al igual que los empleados en el mundo real, los subprocesos en la JVM también necesitan algo de espacio para realizar el trabajo para el que están llamados. Cuando la cantidad de subprocesos supera este límite de espacio de memoria, nos encontraremos con la siguiente pregunta:

Este mensaje: java.lang.OutOfMemoryError: Unable to create new native threadsignifica que la aplicación Java ha alcanzado el límite superior del número de subprocesos que puede ejecutar .

5.2 Razones

Siempre que la JVM solicite un nuevo subproceso del sistema operativo, tiene la oportunidad de encontrarlo java.lang.OutOfMemoryError: Unable to create new native thread. Siempre que el sistema operativo subyacente no pueda asignar un nuevo subproceso nativo, se generará este OutOfMemoryError. El límite exacto del subproceso nativo está relacionado con el plataforma correspondiente, por lo que recomendamos encontrar este límite ejemplo.Sinjava.lang.OutOfMemoryError: Unable to create new native thread embargo, en general, la activación pasa por las siguientes etapas:

  1. Una aplicación que se ejecuta en la JVM solicita un nuevo subproceso de Java
  2. El código nativo de JVM pasa a crear un nuevo subproceso nativo para el sistema operativo
  3. El sistema operativo intenta crear un nuevo subproceso nativo y necesita asignar memoria a este subproceso
  4. El sistema operativo rechazará las asignaciones de memoria nativa, ya sea porque el tamaño del proceso de Java de 32 bits ha agotado su área de direcciones de memoria, por ejemplo: se ha alcanzado el límite de tamaño del proceso de 2 a 4 GB, o porque el sistema operativo ha agotado su memoria virtual.
  5. arroja java.lang.OutOfMemoryError: Unable to create new native threadun error.

5.3 Ejemplos

El siguiente ejemplo comienza y crea nuevos hilos en un bucle. Al ejecutar este código, el sistema operativo alcanzará rápidamente el límite, mostrando el java.lang.OutOfMemoryError: Unable to create new native threadmensaje.

while (true) {
    new Thread(new Runnable()) {
        public void run() {
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) { }
        }
    }}.start();
}

El límite exacto de subprocesos nativos depende de la plataforma, según se probó en Windows, Linux y Mac OS X, los resultados son los siguientes:
- Mac OS X 10.9 de 64 bits, Java 1.7.0_45 - JVM muere después de crear 2031 subprocesos
- Ubuntu de 64 bits Linux, Java 1.7.0_45 - JVM muere después de crear 31893 subprocesos
- Windows 7 de 64 bits, Java 1.7.0_45 - debido a que este sistema operativo utiliza un modelo de subprocesos diferente, el error no parece producirse en esta plataforma. hilos llega a 250.000 , el proceso sigue vivo, aunque el área de intercambio ha utilizado 10 GB, y la aplicación se enfrenta a problemas de rendimiento muy graves.

Entonces, antes de presentar un poco de tiempo de prueba, asegúrese de conocer las limitaciones de su computadora para descubrir cuándo se java.lang.OutOfMemoryError: Unable to create new native threadactivará.

5.4 Soluciones

A veces, puede solucionar este problema aumentando el límite en el nivel del sistema operativo Unable to create new native threadPor ejemplo, si limita lo que la JVM puede generar en el espacio del usuario max user processes, entonces debe verificar e intentar aumentar este límite:

[root@dev ~]# ulimit -a
core file size          (blocks, -c) 0
--- cut for brevity ---
max user processes              (-u) 1800

Muchas veces, se genera un OutOfMemoryError porque la máquina nativa ha alcanzado el límite de subprocesos, lo que puede indicar un error de programación. Cuando su aplicación genera miles de subprocesos, existe una buena posibilidad de que algo esté mal; no hay muchas aplicaciones de las que puedan beneficiarse. una cantidad tan grande de hilos (demasiados hilos, demasiado).

Una forma de resolver este problema es realizar un volcado de hilo para comprender el escenario. Puede pasar varios días haciendo esto. En este momento, contactarme es la mejor manera (@ ̄ー ̄@).

Supongo que te gusta

Origin blog.csdn.net/east4ming/article/details/80179670
Recomendado
Clasificación