5. Es kann kein neuer nativer Thread erstellt werden

5.1 Es kann kein neuer nativer Thread erstellt werden

Java-Anwendungen sind im Allgemeinen multithreaded. Das bedeutet, dass ein in Java geschriebenes Programm (scheinbar) mehrere Dinge gleichzeitig tun kann. Wenn Sie beispielsweise – selbst wenn die Maschine nur über einen Prozessor verfügt – Inhalte von einem Fenster in ein anderes ziehen, Ein im Hintergrund laufender Film stoppt nicht, weil Sie mehrere Dinge gleichzeitig tun.

Eine Möglichkeit, über Threads nachzudenken, besteht darin, sie sich als Arbeiter vorzustellen, die Aufgaben übermitteln können. Wenn Sie nur einen Arbeiter haben, kann er/sie jeweils nur eine Aufgabe erledigen. Wenn Ihnen jedoch ein Dutzend Arbeiter zur Verfügung stehen, können sie das alles gleichzeitig erledigt werden. Einige Ihrer Wünsche.

Genau wie Mitarbeiter in der realen Welt benötigen auch Threads in der JVM etwas Platz, um die Arbeit auszuführen, zu der sie aufgefordert werden. Wenn die Anzahl der Threads diese Speicherplatzbeschränkung überschreitet, werden wir auf die folgende Frage stoßen:

Diese Meldung java.lang.OutOfMemoryError: Unable to create new native threadbedeutet, dass die Java-Anwendung die Obergrenze der Anzahl der Threads erreicht hat, die sie ausführen kann .

5.2 Gründe

Solange die JVM einen neuen Thread vom Betriebssystem beantragt, besteht die Möglichkeit, darauf zu stoßen java.lang.OutOfMemoryError: Unable to create new native thread. Solange das zugrunde liegende Betriebssystem keinen neuen nativen Thread zuweisen kann, wird dieser OutOfMemoryError ausgelöst. Das genaue native Thread-Limit hängt davon ab Daher empfehlen wir, diesen Grenzwert zu ermitteln Beispieljava.lang.OutOfMemoryError: Unable to create new native thread ausführen. Im Allgemeinen durchläuft die Auslösung jedoch die folgenden Phasen:

  1. Eine in der JVM laufende Anwendung fordert einen neuen Java-Thread an
  2. Der native JVM-Code wird übergeben, um einen neuen nativen Thread an das Betriebssystem zu erstellen
  3. Das Betriebssystem versucht, einen neuen nativen Thread zu erstellen und muss diesem Thread Speicher zuweisen
  4. Das Betriebssystem lehnt native Speicherzuweisungen ab, entweder weil die Größe des 32-Bit-Java-Prozesses seinen Speicheradressbereich erschöpft hat – z. B. weil die Prozessgrößenbeschränkung von 2–4 GB erreicht wurde – oder weil das Betriebssystem seinen virtuellen Speicher erschöpft hat
  5. wirft java.lang.OutOfMemoryError: Unable to create new native threadeinen Fehler.

5.3 Beispiele

Das folgende Beispiel startet und erstellt neue Threads in einer Schleife. Beim Ausführen dieses Codes stößt das Betriebssystem schnell an die Grenze und zeigt die java.lang.OutOfMemoryError: Unable to create new native threadMeldung an.

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

Das genaue native Thread-Limit ist plattformabhängig und wurde wie folgt unter Windows, Linux und Mac OS X getestet: 64
-Bit-Mac OS Java 1.7.0_45 – JVM stirbt nach der Erstellung von 31893 Threads – 64-Bit-Windows 7, Java 1.7.0_45 – da dieses Betriebssystem ein anderes Threading-Modell verwendet, scheint der Fehler auf dieser Plattform nicht ausgegeben zu werden. Nachdem die Anzahl der Threads erreicht ist 250.000 , der Prozess ist noch aktiv, obwohl der Auslagerungsbereich 10 GB belegt hat und die Anwendung mit sehr schwerwiegenden Leistungsproblemen konfrontiert ist.

Bevor Sie also eine kleine Testzeit einführen, stellen Sie sicher, dass Sie die Einschränkungen Ihres Computers kennen, um herauszufinden, wann er java.lang.OutOfMemoryError: Unable to create new native threadausgelöst wird.

5.4 Lösungen

Manchmal können Sie dieses Problem umgehen, indem Sie den Grenzwert auf Betriebssystemebene erhöhen Unable to create new native thread. Wenn Sie beispielsweise begrenzt haben, was die JVM im Benutzerbereich erzeugen kann max user processes, sollten Sie diesen Grenzwert überprüfen und versuchen, ihn zu erhöhen:

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

Oft wird ein OutOfMemoryError ausgelöst, weil die native Maschine das Thread-Limit erreicht hat, was auf einen Programmierfehler hinweisen kann. Wenn Ihre Anwendung Tausende von Threads erzeugt, besteht eine gute Chance, dass etwas nicht stimmt – es gibt nicht viele Anwendungen, die davon profitieren können so viele Threads (zu viele Threads, zu viel).

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, einen Thread-Dump zu erstellen, um das Szenario zu verstehen. Sie können mehrere Tage damit verbringen. Zu diesem Zeitpunkt ist es am besten, mich zu kontaktieren (@ ̄ー ̄@).

Ich denke du magst

Origin blog.csdn.net/east4ming/article/details/80179670
Empfohlen
Rangfolge