it-swarm.com.de

Was ist der tatsächliche Speicherplatz für statische Variablen?

Die statische Variable wird für die gesamte Dauer der Programmausführung zugewiesen, sodass weder Stack Noch Heap-Speicher geeignet sind. Wo ist es dann Es sollte einen Ort geben, wo es geladen wird? 

22
Reuben

Statische Felder werden beim Laden einer Klasse initialisiert und beim Entladen des Classloaders für diese Klasse verworfen. Sie können bereinigt oder sogar in einem anderen Klassenlader dupliziert werden.

Für Anwendungen wie diese, die OSGi verwenden, können statische Variablen, die nicht für die gesamte Lebensdauer der Anwendung verwendet werden, viele Male neu geladen werden.

Wie dies implementiert wird, ist möglicherweise JVM-abhängig, aber die Sun/Oracle-JVM erstellt ein "Objekt" für die statischen Felder einer Klasse. Dieses Objekt ist über die Unsafe-Klasse zugänglich, mit der auch diese "Objekte" -Felder untersucht werden können.

17
Peter Lawrey

Wir haben 3 Segmente in unserem Gedächtnis:

  1. Stapelsegment - enthält lokale Variablen und Referenzvariablen (Variablen, die die Adresse eines Objekts im Heap enthalten).

  2. Heap-Segment - enthält alle in Runtime erstellten Objekte, nur Objekte plus deren Objektattribute (Instanzvariablen).

  3. Codesegment - Das Segment, in dem sich die tatsächlich kompilierten Java-Bytecodes befinden, wenn sie geladen werden. Statische Member (Variablen oder Methoden) werden Klassenmitglieder genannt. Dies bedeutet, dass sie sich dort befinden, wo sich die Klasse (Bytecode) befindet, die sich im Codesegment befindet.

28
Sourav

Die statische Variable wird für die gesamte Dauer der Programmausführung zugewiesen, sodass weder Stack noch Heap für sie geeignet sind. 

Tatsächlich werden statische Frames (d. H. Die Frames, die die statischen Variablen enthalten) vom Heap zugewiesen.

Und sie existieren nicht notwendigerweise für die Dauer der Programmausführung. Statische Frames für dynamisch geladene Klassen können beispielsweise zur Garbage-Erfassung verwendet werden, wenn der übergeordnete Klassenlader alle Klassen und alle Instanzen nicht mehr erreichbar ist.

8
Stephen C

Von fünf Speicherbereichen, die von JVM verwendet werden, wird den statischen Feldern Speicher zugewiesen im Klassenbereich (Teil von PremGen) Wenn die Klasse während der Vorbereitungs- und Ladephase vom Anwendungsklassenlader geladen wird ..__ Wenn das Feld primitiv ist, wird der Wert im Klassenbereich gespeichert, und wenn es sich um einen Objekttyp (neuer Operator) handelt, wird er in gespeichert heap, aber die Referenz wird auf die zugewiesene statische Feldvariable im Klassenbereich gegeben. Wenn die Klasse entladen wird, kann der Speicher für dieses statische Feld auch von GC gesammelt werden. 

Wenn das Feld auch final ist, dh statisch final, wird es in einem konstanten Pool unter Klassenbereich gehalten.

1
hi.nitish

Von http://www.daniweb.com/software-development/Java/threads/34695 :

Der Speicher der statischen Variablen wird zugewiesen zu Beginn des Programms in regulärer Speicher statt des Stapels (Speicher speziell für das -Programm reserviert). Der Vorteil davon ist dass es deine Variable macht oder Prozedur völlig konstant, und Sie Der Wert kann nicht versehentlich geändert werden . Der Nachteil davon ist, dass die Speicher wird erst freigegeben, wenn der Programm wird beendet. Ich habe nie etwas gehört, das statische Werte annehmen mehr Speicher als wenn regelmäßig erklärt, aber ihr Gedächtnis Nutzung ist konstant.

1
Rupok

Die statischen Variablen werden dem Speicher in demselben Speichersegment bereitgestellt, in dem der Code gespeichert ist, d. H. Class Area. Es ist unabhängig vom Stack- oder Heap-Segment des Speichers. Sie bleibt während der gesamten Programmdauer zugänglich.

0
Atul Verma