2012-04-13 6 views
2

Weiß jemand, ob es eine Möglichkeit gibt, die Stack-Größe des Haupt-Threads dynamisch (Laufzeit) zu erhöhen? Auch, und ich glaube, es ist die gleiche Frage, ist es möglich, die Stackgröße eines Thread nach seiner Instantiierung zu erhöhen/zu aktualisieren?Aktualisiere die Stack-Größe eines Java-Threads zur Laufzeit

Thread CTOR ermöglicht die Definition seiner Stack-Größe, aber ich kann keine Möglichkeit finden, es zu aktualisieren. Tatsächlich habe ich im JDK keine Verwaltung der Stack-Größe gefunden (was tendenziell anzeigt, dass das nicht möglich ist), alles wird in der VM erledigt.

Nach dem java language specification ist es möglich, die Stapelgröße zu setzen ‚wenn Stapel erstellt wird‘, aber es gibt eine Anmerkung:

Eine Java Virtual Machine Implementierung der Programmierer zur Verfügung stellen kann oder dem Benutzer die Kontrolle über den anfänglichen Größe der Java Virtual Machine Stacks, sowie im Falle dynamisch expandierender oder kontrahierender Java Virtual Machine Stacks, Kontrolle über die maximale und minimale Größe.

das ist IMO nicht ganz klar, das bedeutet, dass einige VM Griff Themen mit dem max (edit) Stackgrößen innerhalb eines bestimmten Bereichs weiterentwickelt? Können wir das mit Hostpot machen (ich habe neben Xss keine Optionen für die Stapelgröße gefunden)?

Danke!

+0

http://stackoverflow.com/questions/3700459/how-to-increase-to-java-stack-size Haben Sie diese Frage gecheckt? Theres keine direkte Antwort, aber gute Diskussion über Stack-Size-Management – kommradHomer

+0

@kommradHomer es ist interessant, aber es ist nicht genau das, was ich suche.Ich möchte wissen, ob eine Stack-Größe aktualisiert werden kann, wenn der Thread bereits läuft (in extremen Fällen würde ein Thread, anstatt mit einem Stack-Overflow zu kollidieren, versuchen, sich anzupassen, indem er seine Stack-Größe erhöht). – Jerome

Antwort

4

Die Stapelgröße dynamcally selbst aktualisiert, wie es verwendet wird, so dass Sie nie so diese benötigen.

Was Sie einstellen können, ist die maximale Größe, die es sein kann mit -Xss Dies ist die verwendete Größe des virtuellen Speichers und Sie können es so groß wie Sie möchten auf 64-Bit-JVMs. Der tatsächlich verwendete Speicher basiert auf der Größe des von Ihnen verwendeten Speichers. ;)

EDIT: Der wichtige Unterschied ist, dass die maximale Größe als virtueller Speicher reserviert ist (so ist der Haufen btw). d.h. der Adressraum ist reserviert, weshalb er auch nicht erweitert werden kann. In 32-Bit-Systemen haben Sie begrenzten Adressraum und dies kann immer noch ein Problem sein. Aber in 64-Bit-Systemen haben Sie normalerweise bis zu 256 TB virtuellen Speicher (eine Prozessorbeschränkung), so dass virtueller Speicher billig ist. Der tatsächliche Speicher wird in Seiten (normalerweise 4 KB) zugewiesen und sie werden nur zugewiesen, wenn sie verwendet werden. Aus diesem Grund scheint der Speicher einer Java-Anwendung im Laufe der Zeit zu wachsen, obwohl die maximale Größe des Heapspeichers beim Start zugewiesen wird. Das gleiche passiert mit Fadenstapeln. Nur die tatsächlich berührten Seiten werden zugeordnet.

+0

In Ordnung, ich verstehe was du meintest. Es beantwortet meine Frage nicht, aber Sie haben darauf hingewiesen, dass der Grund, warum ich gefragt habe, falsch war. Eigentlich dachte ich, dass, sobald Sie einen Thread erstellt haben, die gesamte Stackgröße (das Maximum) reserviert wurde (um Fragmentierung oder was auch immer zu verhindern). Das ist unwahr :) Daher ist es nicht notwendig Threads mit niedrigen maximalen Stack-Größen zu erstellen, die erwarten, dass sie weniger Speicher verbrauchen und dann ihre maximale Stack-Größe anpassen. – Jerome

+0

kümmern, um ein bisschen Peter zu erklären? Bedeutet das, dass ich -Xss104K (minimmum) kann und mich nicht um StackOverflow-Exceptions kümmern muss, weil JVM die Stack-Größe jedes Threads automatisch erhöht, wenn er nahe bei 104k ist? Oder ? – kellogs

+0

@kellogs Das Betriebssystem weist einem Prozess Seiten zu, die diese verwenden. Wenn Sie den Maximalwert auf 1 MB setzen, aber nie mehr als 100 KB verwenden, weist das Betriebssystem diesem Prozess nur 100 KB Seiten für diesen Thread zu. Dies funktioniert gut, da verschiedene Threads die gleiche maximale aber unterschiedliche Verwendung des Stapels haben. –

3

Es gibt keine Möglichkeit, dies im Standard-JDK zu tun, und auch das stackSize Argument ist nicht in Stein gemeißelt:

Die Wirkung des STACK Parameters, falls vorhanden, abhängig hoch Plattform. ... Auf einigen Plattformen hat der Wert des Parameters stackSize möglicherweise keinerlei Auswirkungen. ... Die virtuelle Maschine kann den Parameter stackSize als Vorschlag behandeln.

(Schwerpunkt in original.)

+0

Mit "in Stein gemeißelt" meinst du endgültig? Ja, warum haben sie stackSize nicht als letzte Variable gesetzt, wenn das Aktualisieren unmöglich ist -_- Ich habe überprüft, ob die stackSize-Variable eines Threads aktualisiert wird, sobald sie ausgeführt wird, sie wird nie aktualisiert (mit Werten wie -1, 0, 13). Ich habe keine Lust, stundenlang in openJDK einzuchecken: s – Jerome

+0

Nein, ich meinte, selbst wenn du 'stackSize' an den' Thread'-Konstruktor übergibst, gibt es absolut keine Garantie, dass es der JVM egal ist. Die Dokumente sagen ausdrücklich, dass es der JVM freisteht, Ihr Argument als nur einen Vorschlag zu behandeln oder es vollständig zu ignorieren. – yshavit