Java.Lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden

Suraj P 12 Oktober 2023
  1. Fehler beim Erstellen eines neuen nativen Threads in Java
  2. So beheben Sie den Fehler java.lang.OutOfMemoryError: Es kann kein neuer nativer Thread erstellt werden
  3. Abschluss
Java.Lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden

In diesem Artikel erfahren wir etwas über den Fehler java.lang.OutOfMemoryError: Es kann kein neuer nativer Thread erstellt werden in Java.

Fehler beim Erstellen eines neuen nativen Threads in Java

Die meisten realen Anwendungen, die auf Java basieren, sind von Natur aus multithreaded, mit vielen Komponenten, die unterschiedliche Aufgaben ausführen. Diese Aufgaben werden für einen besseren Durchsatz auf verschiedenen Threads ausgeführt. Die maximale Anzahl von Threads, die die Java-Anwendung erstellen kann, hängt jedoch vom verwendeten Betriebssystem (OS) ab.

Daher wird der Fehler Neuer nativer Thread kann nicht erstellt werden von Java Virtual Machine (JVM) ausgelöst, wenn das Betriebssystem keine neuen Kernel-Threads erstellen kann, die auch als System- oder OS-Threads bezeichnet werden.

Die folgenden Ereignisse passieren am Backend, was zu diesem Fehler führt:

  1. Das Programm/die Anwendung innerhalb der JVM fordert das Betriebssystem nach einem neuen Thread an.
  2. Eine Anforderung wird an das Betriebssystem gesendet, um einen neuen Kernel-Thread durch den nativen JVM-Code zu erstellen.
  3. Das Betriebssystem versucht, einen neuen Thread zu erstellen, der den Speicherzuweisungsschritt umfasst.
  4. Das Betriebssystem kann den Speicher nicht zuweisen, da entweder der virtuelle Speicher vom Betriebssystem erschöpft ist oder der Speicheradressraum von der anfordernden Java-Anwendung erschöpft ist.
  5. Die JVM gibt den Fehler Neuer nativer Thread kann nicht erstellt werden aus.

Sehen wir uns ein Beispiel an, um es besser zu verstehen.

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();
    }
  }
}

Im obigen Code erstellen wir kontinuierlich Threads mit einer Endlosschleife und lassen sie warten, aber da wir kontinuierlich erstellen, während wir die Threads eine Stunde lang halten, werden wir bald die maximale Anzahl von Threads erreichen, die das Betriebssystem zulässt.

So beheben Sie den Fehler java.lang.OutOfMemoryError: Es kann kein neuer nativer Thread erstellt werden

Nun, wie kann man diesen Fehler beheben, oder haben wir hier eine Problemumgehung?

Eine Lösung besteht darin, die Einstellungen auf Betriebssystemebene zu ändern, um die Anzahl der zulässigen Threads zu erhöhen, aber diese Lösung ist aus zwei Gründen nicht durchführbar.

  1. Erstens ist es nicht einfach, Dinge auf Betriebssystemebene neu zu konfigurieren, und es wird auch nicht empfohlen.
  2. Zweitens hat es meistens nichts mit dem Thread-Limit des Betriebssystems zu tun; der Fehler tritt auf, weil wir einen Programmierfehler haben; Zum Beispiel erstellen wir in dem oben beschriebenen Programm kontinuierlich mit einer Endlosschleife, was kein idealer Weg ist.

Eine andere Lösung oder eher eine Problemumgehung besteht darin, das Framework ExecutorService zu verwenden, um die Anzahl der Threads in einem Thread-Pool zu begrenzen, die zu einem bestimmten Zeitpunkt verarbeitet werden können.

Beispiel:

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));
  }
}

Im Code haben wir einen Thread-Pool mit fester Größe erstellt, der maximal 10 Threads haben kann, und dann haben wir einen Runnable-Task erstellt, der die Threads eine Stunde warten lässt.

Mit IntStream haben wir 15 Aufgaben an den Thread-Pool gesendet, also werden 10 eingereicht, während die restlichen 5 in der ExecutorService-Warteschlange stehen.

Abschluss

In diesem Artikel haben wir erfahren, dass der Fehler unable to create new native thread in Java auftritt, wenn das Betriebssystem keine neuen Kernel-Threads erstellen kann. Wir haben uns auch eine Lösung oder einen Workaround mit dem Framework ExecutorService angeschaut.

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

Verwandter Artikel - Java Error