Τι είναι η κατανομή μνήμης στην Java; Μνήμη στοίβας και σωρού



Αυτό το άρθρο που βασίζεται στο 'Memory Allocation in Java' θα σας βοηθήσει με μια λεπτομερή γνώση σχετικά με την κατανομή μνήμης μαζί με τις δομές δεδομένων Stack και Heap.

Κατανομή μνήμης είναι μια διαδικασία με την οποία εκχωρούνται προγράμματα και υπηρεσίες υπολογιστών με φυσικό ή εικονικό μνήμη χώρος. Σε αυτό το άρθρο, θα μάθουμε για την κατανομή μνήμης στο και θα συζητήσουμε τη μνήμη Stack και Heap.

Τι είναι το Stack Memory;

Η μνήμη Java Stack χρησιμοποιείται για την εκτέλεση ενός νήματος. Περιέχουν συγκεκριμένες μεθόδους τιμές που είναι βραχύβιες και αναφορές σε άλλα αντικείμενα στο σωρό που παραπέμπει από τη μέθοδο.





Σωρός Η μνήμη αναφέρεται πάντα στο LIFO (Last-In-First-Out) Σειρά. Κάθε φορά που καλείται μια μέθοδος, δημιουργείται ένα νέο μπλοκ στη μνήμη στοίβας για τη μέθοδο που διατηρεί τοπικές πρωτόγονες τιμές και αναφορά σε άλλα αντικείμενα της μεθόδου.

Μόλις τελειώσει η μέθοδος, το μπλοκ γίνεται αχρησιμοποίητο και καθίσταται διαθέσιμο για την επόμενη μέθοδο.



ποια είναι η ετικέτα span στο html

Το μέγεθος της στοίβας μνήμης είναι πολύ μικρότερο σε σύγκριση με τη μνήμη Heap.

Βασικά χαρακτηριστικά της στοίβας μνήμης

Εκτός από αυτό που έχουμε συζητήσει μέχρι στιγμής, ακολουθούν ορισμένα άλλα χαρακτηριστικά του Σωρός μνήμη:

  • Αυξάνεται και συρρικνώνεται καθώς οι νέες μέθοδοι καλούνται και επιστρέφονται αντίστοιχα
  • Οι μεταβλητές εντός της στοίβας υπάρχουν μόνο εφόσον εκτελείται η μέθοδος που τις δημιούργησε
  • Του αυτομάτως εκχωρείται και απενεργοποιείται όταν η μέθοδος ολοκληρώνει την εκτέλεση
  • Εάν αυτή η μνήμη είναι πλήρης, η Java ρίχνει java.lang.StackOverFlowError
  • Η πρόσβαση σε αυτήν τη μνήμη είναι γρήγορα σε σύγκριση με τη σωστή μνήμη
  • Αυτή η μνήμη είναι ασφαλές νήμα καθώς κάθε νήμα λειτουργεί στη δική του στοίβα

Μέθοδοι στην τάξη Stack

  • Αντικείμενο αντικειμένου ( Στοιχείο αντικειμένου ): Σπρώχνει ένα στοιχείο στην κορυφή της στοίβας.
  • Αναδυόμενο αντικείμενο (): Αφαιρεί και επιστρέφει το επάνω στοιχείο της στοίβας. Ενα «EmptyStackException» Η εξαίρεση ρίχνεται εάν καλέσουμε pop () όταν η στοίβα επίκλησης είναι άδεια.
  • Αντικείμενο αντικειμένου (): Επιστρέφει το στοιχείο στην κορυφή της στοίβας, αλλά δεν το αφαιρεί.
  • Boolean κενό (): Επιστρέφει αλήθεια αν δεν υπάρχει τίποτα στην κορυφή της στοίβας. Αλλιώς, επιστρέφει ψευδές.
  • int αναζήτηση ( Στοιχείο αντικειμένου ): Καθορίζει εάν υπάρχει ένα αντικείμενο στη στοίβα. Εάν το στοιχείο βρεθεί, επιστρέφει τη θέση του στοιχείου από την κορυφή της στοίβας. Αλλιώς, επιστρέφει -1.

Κωδικός Java για εφαρμογή στοίβας

import java.io. * import java.util. * class test {static void stack_push (Stack stack) {για (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//Παραγωγή



memory-allocation-in-java

Τώρα, ας προχωρήσουμε στο Heap Space.

Χώρος σωρού στην Ιάβα

Η μνήμη κατανέμεται κατά την εκτέλεση των εντολών που γράφονται από προγραμματιστές. Σημειώστε ότι ο σωρός ονόματος δεν έχει καμία σχέση με τη δομή δεδομένων σωρού. Ονομάζεται σωρός επειδή είναι ένας σωρός χώρου μνήμης διαθέσιμος στους προγραμματιστές κατανέμεται και καταργήστε την κατανομή. Εάν ένας προγραμματιστής δεν χειρίζεται αυτήν τη μνήμη καλά, μπορεί να υπάρξει διαρροή μνήμηςσυμβαίνει στο πρόγραμμα.

Βασικά χαρακτηριστικά της Java Heap Memory

  • Εκτός από αυτό που έχουμε συζητήσει μέχρι στιγμής, ακολουθούν μερικά άλλα χαρακτηριστικά του χώρου σωρού:
  • Έχει πρόσβαση μέσω σύνθετων τεχνικών διαχείρισης μνήμης που περιλαμβάνουν Νέα γενιά, Γηραιά ή Ενεργή γενιά, και Μόνιμη δημιουργία
  • Εάν ο σωρός είναι γεμάτος, η Java ρίχνει java.lang.OutOfMemoryError
  • Η πρόσβαση σε αυτήν τη μνήμη είναι σχετικά πιο αργή από τη μνήμη στοίβας
  • Αυτή η μνήμη, σε αντίθεση με τη στοίβα, δεν καταργείται αυτόματα. Χρειάζεται Συλλέκτης σκουπιδιών να ελευθερώσετε αχρησιμοποίητα αντικείμενα έτσι ώστε να διατηρήσετε την αποδοτικότητα της χρήσης της μνήμης
  • Σε αντίθεση με το stack, δεν είναι σωρός ασφαλές νήμα και πρέπει να φυλάσσεται σωστά συγχρονίζοντας τον κώδικα

Διαφορά μεταξύ Java Heap Space και Stack Memory

Με βάση τις παραπάνω εξηγήσεις, μπορούμε εύκολα να συμπεράνουμε τις ακόλουθες διαφορές μεταξύ Σωρός και Σωρός μνήμη.

  • Σωρός Η μνήμη χρησιμοποιείται από όλα τα μέρη της εφαρμογής, ενώ η μνήμη στοίβας χρησιμοποιείται μόνο από ένα νήμα εκτέλεσης.
  • Κάθε φορά που δημιουργείται ένα αντικείμενο, αποθηκεύεται πάντα στο Heap space και η μνήμη στοίβας περιέχει την αναφορά σε αυτό. Η μνήμη στοίβας περιέχει μόνο τοπικές πρωτόγονες μεταβλητές και μεταβλητές αναφοράς σε αντικείμενα σε σωρό χώρο.
  • Τα αντικείμενα που είναι αποθηκευμένα στο σωρό είναι προσβάσιμα παγκοσμίως, ενώ η μνήμη στοίβας δεν είναι προσβάσιμη από άλλα νήματα.
  • Η διαχείριση μνήμης στη στοίβα γίνεται σε ένα LIFO τρόπο, ενώ είναι πιο περίπλοκο στη μνήμη Heap, επειδή χρησιμοποιείται παγκοσμίως. Η μνήμη σωρού χωρίζεται σε Νέας γενιάς, παλιάς γενιάς κ.λπ., περισσότερες λεπτομέρειες στο Java Garbage Collection.
  • Η στοίβα μνήμης είναι βραχύβια ενώ η σωστή μνήμη ζει από την αρχή έως το τέλος της εκτέλεσης της εφαρμογής.
  • Μπορούμε να χρησιμοποιήσουμε -ΧΜΧ και -ΧΜΣ Επιλογή JVM για να ορίσετε το μέγεθος εκκίνησης και το μέγιστο μέγεθος της μνήμης σωρού. Μπορούμε να χρησιμοποιήσουμε -XSS για να ορίσετε το μέγεθος της μνήμης στοίβας.
  • Όταν η μνήμη στοίβας είναι πλήρης, ο χρόνος εκτέλεσης Java ρίχνει java.lang.StackOverFlowError ενώ αν η μνήμη σωρού είναι πλήρης, ρίχνει java.lang.OutOfMemoryError: Java Heap Spaceλάθος.
  • Το μέγεθος της στοίβας μνήμης είναι πολύ μικρότερο σε σύγκριση με τη μνήμη Heap. Λόγω απλότητας στην κατανομή μνήμης (LIFO), Η μνήμη στοίβας είναι πολύ γρήγορη σε σύγκριση μεσωστή μνήμη.

Συγκριτικό διάγραμμα

ΠΑΡΑΜΕΤΡΟΣ ΣΩΡΟΣ ΣΩΡΟΣ
Βασικός Η μνήμη εκχωρείται σε ένα συνεχόμενο μπλοκΗ μνήμη κατανέμεται με τυχαία σειρά
Κατανομή και εκκαθάριση Αυτόματο από μεταγλωττιστήΕγχειρίδιο από τον προγραμματιστή
Κόστος Πιο λιγοΠερισσότερο
Εκτέλεση ΣκληρόςΑνετα
Χρόνος πρόσβασης ΓρηγορότεραΒραδύτερη
Κύριο θέμα Έλλειψη μνήμηςΚατακερματισμός μνήμης
Τοποθεσία διαφοράς ΕξοχοςΕπαρκής
Ευκαμψία Σταθερό επιτόκιοΕίναι δυνατή η αλλαγή μεγέθους

Με αυτό, φτάνουμε στο τέλος αυτού του Οδηγού «Κατανομή μνήμης σε Java». Ελπίζω να έχετε κατανοήσει την ιδέα και την εφαρμογή της μέσω ορισμένων παραδειγμάτων σε πραγματικό χρόνο.

Τώρα που έχετε καταλάβειΚατανομή μνήμης στην Javaβασικά μέσα από αυτό το άρθρο 'Κατανομή μνήμης σε Java' δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Τα μαθήματα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχουν σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για βασικές όσο και για προχωρημένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Ανοιξη .

Έχετε μια ερώτηση για εμάς; Αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Memory Allocation in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.