2010-07-05 1 views
11

Wir haben ein kleines Textfeld mit 512 MB RAM. Wir wollten sehen, wie viele Threads wir in Java in diesem Feld erstellen können. Zu unserer Überraschung können wir nicht viele schaffen. Im Wesentlichen ist die minimale Stackgröße, die Sie mit -Xss einstellen können, 64k. Einfache mathematische werden Ihnen sagen, dass 64 * 7000 wird 430Mb verbrauchen, so dass wir nur in der Lage waren, um es bis zu rund 7000 Fäden oder so und dann stießen wir auf diesen Fehler:Java sehr begrenzt auf maximale Anzahl von Threads?

java.lang.OutOfMemoryError: unable to create new native thread. 

Ist dies die wahre Grenze mit Java? Pro 512 MB RAM können wir nur 7k Anzahl von Threads oder so drücken?

+1

brauchst du wirklich so viele threads? Wie viele CPUs/Kerne hat die Maschine? – Bwmat

+0

Wir planen, viele Kunden zu unterstützen. Es ist in einer virtuellen Cloud gehostet, also nicht sicher. – erotsppa

+17

Wenn Sie 7000 native Threads benötigen, liegt ein schwerwiegender Konstruktionsfehler in Ihrer Anwendung vor. –

Antwort

2

Es ist nicht die Programmiersprache, es ist auf der Betriebssystemebene.

Mehr darüber zu lesen, für Windows:

+0

Im Fall dieser Person treffen sie ein Speicherlimit, bevor sie das Kernellimit erreichen. –

+0

@Jason - tatsächlich habe ich unterwegs den "OutOfMemoryError" verpasst. – Gnoupi

+3

Ich glaube, dass "OutOfMemoryError: neuer nativer Thread kann nicht erstellt werden" * kann verursacht werden durch das pro Prozess Thread-Limit des Betriebssystems, obwohl es ein OutOfMemoryError ist. Nicht 100% sicher, aber. – ColinD

2

Denken Sie daran, dass Sie nie zu widmen 100% des RAM der Lage sein, Java-Threads ausführen. Einige RAMs werden vom Betriebssystem und anderen laufenden Anwendungen verwendet, sodass Sie nie die vollen 512 MB zur Verfügung haben.

0

Versuchen Sie, den maximal erlaubten Speicher -Xmx auf einen niedrigeren Wert zu setzen und festzustellen, ob die Anzahl der Threads erhöht werden kann. In einem Projekt bei der Arbeit konnte ich ungefähr 2.5k Threads mit -Xmx512m und ungefähr 4k Threads mit -Xmx96m zuweisen.

Je größer Ihr Heap, desto kleiner ist der Platz im Thread-Stack (zumindest meiner Erfahrung nach).

3

Sobald Sie Ihre 7k-Threads erstellen, werden Sie keinen Speicher mehr haben, um etwas Nützliches zu tun. Vielleicht sollten Sie das Design Ihrer Anwendung überdenken?

Wie auch immer, ist 512Mb nicht ziemlich klein? Vielleicht könnten Sie ein bisschen mehr Informationen über Ihre Anwendung oder vielleicht die Domain geben?

8

Verwenden Sie asynchrone IO (Java Nio) und Sie werden keine 7k-Threads benötigen, um 7k Clients zu unterstützen, ein paar Threads für die Behandlung von io (5?) Wird ausreichen.
Werfen Sie einen Blick auf Netty;)

Ein Thread für jeden Client ist ein wirklich schlechtes Design.

+0

Gibt es noch eine Begrenzung für die Anzahl der NiO-Threads? Ich habe es mit einer 3rd-Party-Bibliothek zu tun, die scheinbar Tausende von Threads erstellt, es benutzt nio tho ... Scheint den gleichen Fehler zu verursachen, der von OP beschrieben wurde ... –

1

Sie benötigen nicht unbedingt einen Thread pro Clientsitzung. Wenn Sie sich ansehen, wie ein J2EE- (oder JavaEE-) Server mehrere Verbindungen verarbeitet, verwendet er eine Mischung aus Strategien, einschließlich Nebenläufigkeit, Warteschlangenbildung und Swapping. In der Regel können Sie die maximale Anzahl gleichzeitiger Live-Instanzen und Leerlauf-Zeitüberschreitungswerte zum Zeitpunkt der Bereitstellung konfigurieren, um die Leistung Ihrer Anwendung zu optimieren.

Verwandte Themen