Middle
Πώς είναι δομημένη η μνήμη στη Java;
sobes.tech AI
Απάντηση από AI
Στην Java, η μνήμη διαχειρίζεται αυτόματα από τον συλλέκτη απορριμμάτων και διαιρείται σε διάφορες περιοχές:
-
Heap (Συλλογή):
- Αποθηκεύει αντικείμενα κλάσεων και πίνακες.
- Μία για όλα τα νήματα της εφαρμογής.
- Ο συλλέκτης απορριμμάτων εργάζεται με αυτήν την περιοχή.
- Είναι χωρισμένη σε γενιές (Νεαρό, Παλιό, Μόνιμο).
-
Stack (Στοίβα):
- Κάθε νήμα έχει τη δική του στοίβα.
- Αποθηκεύει τοπικές μεταβλητές τύπων primitive και αναφορές σε αντικείμενα στον heap.
- Τα δεδομένα προστίθενται και αφαιρούνται σύμφωνα με την αρχή LIFO (Last-In, First-Out).
- Απελευθερώνεται αυτόματα στο τέλος της μεθόδου.
-
Method Area (Περιοχή Μεθόδων) / PermGen (μέχρι Java 8) / Metaspace (από Java 8):
- Αποθηκεύει πληροφορίες σχετικά με τις φορτωμένες κλάσεις:
- Μεταδεδομένα κλάσεων.
- Bytecode των μεθόδων.
- Στατικές μεταβλητές.
- Pool σταθερών.
- Το μέγεθος του PermGen ήταν σταθερό, το Metaspace χρησιμοποιεί μνήμη native και μπορεί να επεκταθεί δυναμικά.
- Αποθηκεύει πληροφορίες σχετικά με τις φορτωμένες κλάσεις:
-
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 μεθόδου) |