Sobes.tech
Middle

Πώς είναι δομημένη η μνήμη στη Java;

sobes.tech AI

Απάντηση από AI

Στην Java, η μνήμη διαχειρίζεται αυτόματα από τον συλλέκτη απορριμμάτων και διαιρείται σε διάφορες περιοχές:

  1. Heap (Συλλογή):

    • Αποθηκεύει αντικείμενα κλάσεων και πίνακες.
    • Μία για όλα τα νήματα της εφαρμογής.
    • Ο συλλέκτης απορριμμάτων εργάζεται με αυτήν την περιοχή.
    • Είναι χωρισμένη σε γενιές (Νεαρό, Παλιό, Μόνιμο).
  2. Stack (Στοίβα):

    • Κάθε νήμα έχει τη δική του στοίβα.
    • Αποθηκεύει τοπικές μεταβλητές τύπων primitive και αναφορές σε αντικείμενα στον heap.
    • Τα δεδομένα προστίθενται και αφαιρούνται σύμφωνα με την αρχή LIFO (Last-In, First-Out).
    • Απελευθερώνεται αυτόματα στο τέλος της μεθόδου.
  3. Method Area (Περιοχή Μεθόδων) / PermGen (μέχρι Java 8) / Metaspace (από Java 8):

    • Αποθηκεύει πληροφορίες σχετικά με τις φορτωμένες κλάσεις:
      • Μεταδεδομένα κλάσεων.
      • Bytecode των μεθόδων.
      • Στατικές μεταβλητές.
      • Pool σταθερών.
    • Το μέγεθος του PermGen ήταν σταθερό, το Metaspace χρησιμοποιεί μνήμη native και μπορεί να επεκταθεί δυναμικά.
  4. Native Method Stacks (Στοίβες native μεθόδων):

    • Χρησιμοποιείται για κλήσεις σε native μεθόδους (π.χ., C/C++).
    • Απελευθερώνεται στο τέλος της native μεθόδου.
// Παράδειγμα χρήσης μνήμης
public class MemoryExample {

    private String instanceVariable; // Αποθηκεύεται στον Heap

    public void myMethod(int parameter) { // parameter στον Stack

        int localVar = 10; // localVar στον Stack

        String localString = "hello"; // "hello" στην Pool String (μέρος του Heap/Method Area), η αναφορά localString στον Stack

        Object obj = new Object(); // Object στον Heap, η αναφορά obj στον Stack

        Integer wrapper = new Integer(5); // Integer στον Heap, η αναφορά wrapper στον Stack
    }

    public static void main(String[] args) {
        MemoryExample example = new MemoryExample();
        example.myMethod(20);
    }
}

Περιοχές μνήμης και το περιεχόμενό τους:

Περιοχή Πού βρίσκεται? Τι αποθηκεύει? Διαχείριση
Heap Κοινόχρηστη για την JVM Αντικείμενα, πίνακες Garbage Collector
Stack Ιδιόκτητη για κάθε νήμα Τοπικές μεταβλητές primitive, αναφορές σε αντικείμενα Αυτόματο (στο τέλος της μεθόδου)
Method Area Κοινόχρηστη για την JVM Μεταδεδομένα κλάσεων, στατικές μεταβλητές, bytecode, σταθερές Garbage Collector (για κλάσεις και στατικά)
Native Stacks Ιδιόκτητη για κάθε νήμα (κατά την κλήση) Μεταβλητές και δεδομένα native μεθόδων Αυτόματο (στο τέλος της native μεθόδου)