Wie werden statische Arrays im Java-Speicher gespeichert?

Lesezeit: 4 Minuten

Benutzer-Avatar
tskuzzy

In einer Sprache wie C ist der Speicher also in 5 verschiedene Teile unterteilt: OS-Kernel, Textsegment, statischer Speicher, dynamischer Speicher und der Stapel. Etwas wie das:

Speicherlayout

Wenn wir ein statisches Array in C deklariert haben, mussten Sie seine Größe vorher angeben, danach wäre das für immer behoben. Das Programm würde dem Array genügend Speicher zuweisen und es wie erwartet in das statische Datensegment einfügen.

Mir ist jedoch aufgefallen, dass Sie in Java Folgendes tun könnten:

public class Test {
        static int[] a = new int[1];

        public static void main( String[] args ) {
                a = new int[2];
        }
} 

und alles würde so funktionieren, wie Sie es erwarten würden. Meine Frage ist, warum funktioniert das in Java?

EDIT: Der Konsens ist also, dass an int[] in Java verhält es sich eher wie ein int* in C. Gibt es als Folgefrage eine Möglichkeit, Arrays im statischen Speicher in Java zuzuweisen (wenn nein, warum nicht)? Würde dies nicht einen schnelleren Zugriff auf solche Arrays ermöglichen? EDIT2: ^ Dies ist jetzt in einer neuen Frage: Wo werden statische Klassenvariablen im Speicher gespeichert?

  • Tatsächlich gilt das gezeigte Modell nicht einmal allgemein für C. Es mag für Ihren üblichen Desktop gelten, aber das Speichermodell in C ist ziemlich einfach und großzügig. C auf einem eingebetteten System sieht völlig anders aus.

    – Voo

    11. Juli 2011 um 18:47 Uhr

  • @tskuzzy: Sie sollten Ihre Folgefrage als weitere Frage stellen, um die folgenden Antworten eindeutig zu machen.

    – Benutzer7116

    11. Juli 2011 um 19:14 Uhr

  • @sixlettervariables: Danke, wird reichen.

    – tskuzzy

    11. Juli 2011 um 19:16 Uhr

  • Ich glaube nicht, dass “in einer Sprache wie C der Speicher getrennt ist”. Der Sprachstandard achtet sehr darauf, keine Einzelheiten der Speicherimplementierung vorzuschreiben. Außerdem hat Ihr Bild nur drei benannte Segmente, aber Sie behaupten, es seien fünf.

    – Kerrek SB

    11. Juli 2011 um 19:32 Uhr

  • @ Kerrek SB: Nun, es ist nicht per se “getrennt”. Aber es gibt definitiv unterschiedliche Speicherregionen. Ich bin mir nicht sicher, was der Standard sagt, aber ich denke, die meisten Computer folgen einem ähnlichen Speicherlayout wie dem beschriebenen. “Reserviert” == “OS Kernel”, und ich denke, sie haben das Textsegment mit dem statischen Datensegment im Bild kombiniert.

    – tskuzzy

    11. Juli 2011 um 19:35 Uhr

Der Wert von a ist nur ein Verweis auf ein Objekt. Der Array-Erstellungsausdruck (new int[2]) erstellt a Neu Objekt in der richtigen Größe und weist ihm einen Verweis zu a.

Beachten Sie, dass static in Java ist ziemlich getrennt von static in C. In Java bedeutet es nur “bezogen auf den Typ und nicht auf eine bestimmte Instanz des Typs”.

  • +1, für einen tieferen Blick auf C’s static gegen Javas static siehe stackoverflow.com/questions/728534/…

    – Benutzer7116

    11. Juli 2011 um 18:40 Uhr

In Java jedes Mal, wenn Sie das Wort verwenden new, wird Speicher für dieses Objekt auf dem Heap zugewiesen und eine Referenz zurückgegeben. Dies gilt auch für Arrays. Das int[] a ist nur der Hinweis auf new int[1]. Wenn Sie das tun new int[2], wird ein neues Array zugewiesen und auf a verwiesen. Das alte Array wird bei Bedarf einer Garbage Collection unterzogen.

Sie erstellen ein neues Array und ändern nicht das alte. Das neue Array erhält seinen eigenen Platz und das alte wird in den Garbage Collection abgelegt (solange niemand sonst einen Verweis darauf hat).

Ich nehme an, wenn Sie sich auf “statischen Speicher” beziehen, beziehen Sie sich auf den Heap. In Java dient der Heap einem ähnlichen Zweck wie das von Ihnen erwähnte “statische Datensegment”. Auf dem Heap werden die meisten Objekte zugewiesen, einschließlich Arrays. Auf dem Stapel hingegen werden Objekte platziert, die nur während der Lebensdauer einer einzelnen Methode verwendet werden.

In Java haben Sie lediglich darum gebeten, dass eine stark typisierte Referenz auf ein Array statisch für die Klasse gespeichert wird Test. Du kannst was ändern a bezieht sich auf zur Laufzeit, was auch das Ändern der Größe. Dies wäre das C-Äquivalent einer statischen Speicherung von an int*.

Benutzer-Avatar
Ted Hopp

Auf Java, a static Variable existiert als Teil des Klassenobjekts. Stellen Sie es sich als Instanzvariable für die Klasse selbst vor. In deinem Beispiel a ist eine Referenzvariable, die sich auf ein Array bezieht (oder gar kein Array, falls dies der Fall ist null), aber das Array selbst wird zugewiesen, da alle Arrays in Java sind: off the heap.

Benutzer-Avatar
Costis Aivalis

Static hat in Java eine andere Bedeutung. Wenn Sie in Java eine Variable als statisch deklarieren, handelt es sich um eine Klassenvariable und nicht um eine Instanzvariable.

1216110cookie-checkWie werden statische Arrays im Java-Speicher gespeichert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy