13 Stimmen

Wo werden statische Klassenvariablen im Speicher abgelegt?

Dies ist eine Folgefrage zu Wie werden statische Arrays im Java-Speicher gespeichert? .

Globale Variablen in C/C++ werden also im statischen Datensegment des Speichers gespeichert. Aber was ist mit statischen Klassenvariablen in Java/C++?

Es kann nicht das statische Datensegment sein, weil Sie nicht wissen, welche/wie viele Klassen während der Dauer Ihres Programms referenziert werden (wegen der Reflexion). Es ist definitiv nicht der Stack, denn das macht keinen Sinn. Es auf dem Heap zu speichern ist auch etwas zweifelhaft.

2 Stimmen

Ist dies eine C++ oder eine Java Frage? In C++ sind statische Mitglieder nur globale Variablen.

0 Stimmen

@Kerrek: Ich glaube, er fragt sich nach der Java-Speicherverwaltung von static die die C/C++-Verwaltung von ähnlich Konzepte.

0 Stimmen

@Six: Klar, ich fand nur "was ist mit statischen Klassenvariablen in Java/C++" etwas verwirrend. Ich freue mich auf die Java-bezogenen Antworten. Übrigens, hat Java haben einen ausdrücklichen "Haufen"?

5voto

bdonlan Punkte 213545

In Java werden statische Klassenvariablen tatsächlich auf dem Heap gespeichert, zusammen mit allen anderen Klassenmetadaten. Für Java sehen sie wie Globals aus, aber für die Heap-Verwaltungsroutinen der JVM auf niedriger Ebene sind sie dynamische Daten (obwohl sie zur Verbesserung der GC-Effizienz etwas speziell behandelt werden können, da sie wahrscheinlich sehr langlebig sind). Schließlich können Klassen entladen werden, indem ihr Classloader nicht referenziert wird.

Was die Frage betrifft, ob es dasselbe ist wie das C malloc() nicht wahrscheinlich. Die meisten JVMs kontrollieren ihre Heaps auf einer niedrigen Ebene; sie holen sich einen Teil des Speichers vom Betriebssystem und teilen ihn selbst auf. Daher werden die meisten Java-Daten, einschließlich statischer Daten, nicht im malloc-Heap gespeichert, sondern in einem separaten Heap, der von der JVM verwaltet wird.

3voto

antlersoft Punkte 14491

Java verfügt über einen "permanenten" Heap, in dem es Klassen-Metadaten ablegt. Die "Wurzeln" der statischen Werte befinden sich also im permanenten Heap. Die Werte sind Referenzwerte (Klassenobjekte), die Werte selbst befinden sich im regulären Heap.

5 Stimmen

Wollen Sie damit sagen, dass die JVM zwei separate Heaps hat?

1voto

satish reddy Punkte 51

Statische Variablen werden nicht im Heap gespeichert.. Sie sind Teil des Datensegments. Lokale Variablen werden in - Stack gespeichert; Instanzvariablen werden im - Heap gespeichert; Klassenvariablen (statisch) werden im Datensegment gespeichert. Diese Variablen werden von allen Objekten dieser Klasse gemeinsam genutzt. Ihr endgültiger maschinengleicher Java-Code wird im - Code/Text-Segment gespeichert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X