Ich möchte die Anzahl der für die Java-VM verfügbaren Threads / Prozesse begrenzen, ähnlich wie Sie den verfügbaren Speicher einstellen. Ich möchte in der Lage sein, es zu spezifizieren, um nur 1 Faden oder eine willkürliche Zahl zu benutzen.
HINWEIS: Ich kann es nicht im Code festlegen, da der Code, den ich beschränken möchte, eine Bibliothek ist, in der ich die Quelle nicht ändern kann. Es muss also eine harte Kappe sein, die dem Level der virtuellen Maschine auferlegt wird. (Oder wenn Sie der Anwendung selbst ein Thread-Limit auferlegen könnten, das Bibliotheken überschreiben könnte?)
HINWEIS2: Der Zweck ist ein Leistungstest, um eine Bibliothek, die ich testen möchte, zu drosseln, um zu sehen, wie gut sie funktionieren würde, wenn sie Zugriff auf eine andere Anzahl von CPUs / Threads hat.
Danke!
Es gibt kein VM-Flag oder eine Eigenschaft, um die Anzahl der für Java verfügbaren CPUs zu steuern, d. h. welche Runtime.availableProcessors()
zurückgibt.
Wenn Sie unter Windows und Solaris die Prozess-Affinitätsmaske festlegen, wirkt sich dies auch auf Runtime.availableProcessors()
aus. Unter Linux funktioniert das jedoch nicht, siehe JDK-6515172 . Leider ist das Update nur für Java 10 gedacht, aber der vorgeschlagene Patch ist in der Fehlerdiskussion enthalten.
Es gibt auch eine Arbeit für Linux mit LD_PRELOAD Patch oder einem OS-Level-Trick, siehe Details in diese Frage .
Ich schlage vor, Sie könnten Ihren eigenen SecurityManager implementieren und installieren, der die Anzahl der erstellten Threads verfolgt und einen Fehler auslöst, wenn das Maximum erreicht ist.
Gemäß der akzeptierten Antwort auf Diese Frage , ein RuntimePermission
mit dem Ziel "modifyThreadGroup" wird jedes Mal überprüft, wenn ein neuer Thread erstellt / gestartet wird.
Aktualisieren
Ein erster Ansatz des SecurityManagers könnte so aussehen:
%Vor%Natürlich müssen weitere Tests durchgeführt werden, um zu gewährleisten, dass Systemthreads immer erlaubt sind. Und bleiben Sie, dass dieser Algorithmus die Zählung nicht verringert, wenn ein Thread endet.
Als letzten Ausweg könnte ich die Affinität der Java-VM im Task-Manager so einstellen, dass nur 1 (oder mehr) CPUs verwendet werden. (Dies wird natürlich immer noch mehrere Threads auf 1 CPU erlauben, aber es ist wahrscheinlich das Nächste, was ich wollte, wenn niemand bessere Ideen hat)
Tags und Links java multithreading jvm