Java.Lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden
- Fehler beim Erstellen eines neuen nativen Threads in Java
-
So beheben Sie den Fehler
java.lang.OutOfMemoryError: Es kann kein neuer nativer Thread erstellt werden
- Abschluss
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:
- Das Programm/die Anwendung innerhalb der JVM fordert das Betriebssystem nach einem neuen Thread an.
- Eine Anforderung wird an das Betriebssystem gesendet, um einen neuen Kernel-Thread durch den nativen JVM-Code zu erstellen.
- Das Betriebssystem versucht, einen neuen Thread zu erstellen, der den Speicherzuweisungsschritt umfasst.
- 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.
- 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.
- Erstens ist es nicht einfach, Dinge auf Betriebssystemebene neu zu konfigurieren, und es wird auch nicht empfohlen.
- 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.
Verwandter Artikel - Java Error
- Adresse wird bereits verwendet JVM_Bind-Fehler in Java
- Android Java.Lang.IllegalStateException behoben: Methode der Aktivität konnte nicht ausgeführt werden
- Ausnahme im Hauptthread Java.Lang.ClassNotFoundException in IntelliJ IDEA
- Ausnahme im Hauptthread Java.Lang.NoClassDefFoundError
- Beheben Sie das Problem, dass Java nicht installiert werden kann. Es gibt Fehler in den folgenden Schaltern
- Beheben Sie den Fehler `Es wurde keine Java Virtual Machine gefunden` in Eclipse