Frage

Ich weiß, dass lokale Variablen und Parameter der Methoden in Stapeln leben, aber ich, um herauszufinden, nicht in der Lage, wo sich tatsächlich Methoden bei Java leben?

Wenn ich erkläre jedes Thread-Objekt wie:

Thread t=new Thread();
t.start();

So ist es bedeutet, dass ich einen separaten Aufruf von Methoden aus dem Hauptverfahren auseinander erstellt habe. Was heißt das? Bedeutet es, getrennter Abfolge von Methoden über Stapelspeicher aufrufen? Habe ich Recht?

War es hilfreich?

Lösung

Jeder Thread seinen eigenen Stapel zugeordnet ist.

Dieser Artikel hat eine gute Einführung auf den Speicher Trennung innerhalb eines Java-Prozesses.

  

Innerhalb der virtuellen Java-Maschine, die jeweils   Thread ist ein Java-Stack gewährt, die   enthält Daten keinen anderen Thread kann   Zugang, die lokalen Variablen, einschließlich,   Parameter und Rückgabewerte von jedem   Verfahren der Faden aufgerufen. Das   Daten auf dem Stack ist begrenzt auf   primitive Typen und Objektreferenzen.   In der JVM, ist es nicht möglich,   Stellen Sie das Bild eines tatsächlichen Objekts auf   der Stapel. Alle Objekte befinden sich auf der   Heap.

Ich habe viele Szenarien gesehen, in denen Kunden enorm threaded Server auf der Basis implementiert haben, die jeder Thread sehr wenig tut, und sie laufen in Probleme mit dem Gedächtnis. Das ist, weil jeder Thread seinen eigenen Stapel zugeordnet ist, und diese (natürlich) addiert. I denken der Standardwert 512k pro Thread ist, aber ich habe nicht eine kanonische Quelle dafür.

gefunden

Andere Tipps

Wenn ich mich richtig erinnere, der Methodencode selbst wird in dem Code Teil des Speichers lebt, während die intern deklarierten Variablen in dem Stapel leben werden, und die Objekte auf dem Heap erstellt werden. In Java, leben die variablen Zeiger und Primitiven auf dem Stapel, während alle erstellten Objekte in der Halde leben.

Für eine (schlecht) ASCII-Darstellung:

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

Wenn der Stapel den Stapel darstellt, FREE freien Speicher, HEAP den Haufen darstellt, und CODE stellt den Coderaum.

Dies ist, was mein Gedächtnis sagt -. Einige Details falsch sein könnte

Der Stapel wird von Methodenaufrufe enthalten. Welche Java drückt auf den Stapel ein Methodenaufruf Datensatz, der alle Variablen kapselt (beide Parameter und lokal instanziiert Variablen) für diese Methode. Wenn Sie eine Java-Anwendung starten, die Hauptmethode (der den args Parameter automatisch schließt) ist das einzige, was auf dem Stapel:

main(args)

Wenn Sie sagen, ein Objekt Foo erstellen und rufen foo.method (), jetzt der Stapel wie folgt aussieht:

method()
main(args)

Als Methoden aufgerufen werden, werden sie auf den Stapel geschoben, und als sie zurückkommen, werden sie entfernt oder „knallte“ vom Stapel. Als Variablen deklariert werden, und verwendet, um den Stack-Eintrag, der (an der Spitze des Stapels) zu der aktuellen Methode entspricht, wächst die Größe der Variablen umfassen.

Für Ihr Beispiel mit einem Gewinde, jeder Thread wird seinen eigenen Stapel hat, die von der jeweils anderen Threads Stapeln unabhängig existiert.

Der Stapel enthält alle lokalen Variablen und alle aktiven Methodenaufrufe. Der Haufen halten alles andere.

Wie für Ihre Unter Frage: es bedeutet, ein neuer Stapel mit seinem eigenen dedizierten Speicher erstellt. Während Ihr neuer Thread den Gesamt Heap-Speicher (Speicher) von der JVM zugewiesen wird teilen

Der Haufen ist in mehrere Generationen aufgeteilt.

Die Bytecode und seine corrosponding JIT kompilierten Maschinencode lebt in der so genannten Dauer Generation, zusammen mit internierten Strings und anderen Klassendaten.

Auch wenn es die „permanente“ Generation genannt wird, kann es immer noch Müll gesammelt werden. Einige Bibliotheken, Frameworks und JVM Sprachen erzeugen Bytecode zur Laufzeit, so dass die permanente Erzeugung benötigen manchmal aufzuräumen. Genau wie die anderen Generationen des Haufens, aber (man in der Regel hofft) seltener auf.

Die tatsächliche Bytecode und / oder JIT'd Code würde in dem Prozess der Erinnerung lebt. Es würde eine Kopie davon wahrscheinlich nur in den Prozessspeicher sein, da alle Threads in einem bestimmten Prozess Anteil, dass der Speicher. Alle Variablen shared von diesen Fäden werden von den Methoden gemeinsam zugegriffen werden. Variablen lokal auf die Gewinde (auch Verfahren lokale Variablen innerhalb eines Threads verwendet wird) wird innerhalb von diesem Thread Speicher angelegt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top