logo

Stack vs Heap Java

A Java, gestió de la memòria és un procés vital. Està gestionat per Java automàticament. La JVM divideix la memòria en dues parts: pila memòria i memòria heap. Des de la perspectiva de Java, ambdues són àrees de memòria importants, però totes dues s'utilitzen amb finalitats diferents. El diferència important entre la memòria de pila i la memòria de pila és que la pila s'utilitza per emmagatzemar l'ordre d'execució del mètode i les variables locals, mentre que la memòria dinàmica emmagatzema els objectes i utilitza l'assignació i la desassignació de memòria dinàmica. En aquesta secció, parlarem de les diferències entre stack i heap en detall.

Stack vs Heap Java

Memòria de pila

La memòria de pila és un espai físic (en RAM) assignat a cada fil en temps d'execució. Es crea quan es crea un fil. La gestió de la memòria a la pila segueix l'ordre LIFO (últim en entrar, primer en sortir) perquè és accessible a nivell mundial. Emmagatzema les variables, les referències a objectes i els resultats parcials. Memòria assignada per apilar vides fins que la funció torni. Si no hi ha espai per crear els nous objectes, llançarà eljava.lang.StackOverFlowError. L'abast dels elements es limita als seus fils. El JVM crea una pila independent per a cada fil.

Memòria Heap

Es crea quan s'inicia la JVM i l'utilitza mentre l'aplicació s'executi. Emmagatzema objectes i classes JRE. Sempre que creem objectes, ocupa espai a la memòria del munt mentre que la referència d'aquest objecte es crea a la pila. No segueix cap ordre com la pila. Gestiona dinàmicament els blocs de memòria. Vol dir que no hem de manejar la memòria manualment. Per gestionar la memòria automàticament, Java proporciona el col·lector d'escombraries que elimina els objectes que ja no s'utilitzen. La memòria assignada a l'emmagatzematge de les vides fins que no es produeixi cap esdeveniment, ja sigui el programa finalitzat o la memòria lliure. Els elements són accessibles globalment a l'aplicació. És un espai de memòria comú compartit amb tots els fils. Si l'espai d'emmagatzematge dinàmic està ple, llança el fitxerjava.lang.OutOfMemoryError. La memòria de pila es divideix a més en les àrees de memòria següents:

  • Generació jove
  • Espai supervivent
  • vella generació
  • Generació permanent
  • Memòria cau de codi

La imatge següent mostra l'assignació de la memòria de pila i l'espai dinàmic.

Stack vs Heap Java

Diferència entre la memòria de pila i la memòria heap

La taula següent resumeix totes les diferències principals entre la memòria de pila i l'espai dinàmic.

Paràmetre Memòria de pila Espai Heap
Aplicació Emmagatzema articles que tenen una vida molt curta com ara mètodes, variables, i variables de referència dels objectes. S'emmagatzema objectes i Java Runtime Environment ( JRE ) classes.
Encàrrec Segueix el LIFO ordre. No segueix cap ordre perquè és una assignació de memòria dinàmica i no té cap patró fix per a l'assignació i desassignació de blocs de memòria.
Flexibilitat És no flexible perquè no podem alterar la memòria assignada. És flexible perquè podem alterar la memòria assignada.
Eficiència més ràpid accés, assignació i desassignació. més lent accés, assignació i desassignació.
Mida de la memòria És més petit en grandària. És més gran en grandària.
Opcions de Java utilitzades Podem augmentar la mida de la pila utilitzant l'opció JVM -Xss. Podem augmentar o reduir la mida de la memòria dinàmica utilitzant les opcions JVM - Xmx i -Xms.
Visibilitat o abast Les variables només són visibles per al fil propietari. És visible per a tots els fils.
Generació de l'espai Quan es crea un fil, el sistema operatiu assigna automàticament la pila. Per crear l'espai dinàmic per a l'aplicació, el llenguatge primer crida al sistema operatiu en temps d'execució.
Distribució Es crea una pila separada per a cada objecte. Es comparteix entre tots els fils.
Llançaments d'excepció JVM llança el java.lang.StackOverFlowError si la mida de la pila és superior al límit. Per evitar aquest error, augmenteu la mida de la pila. JVM llança el java.lang.OutOfMemoryError si la JVM no pot crear un mètode natiu nou.
Assignació/Desassignació Ho fa automàticament el compilador . Es realitza manualment per la programador .
Cost El seu cost és menys . El seu cost és més en comparació amb la pila.
Implementació La seva implementació és dur . La seva implementació és fàcil .
Ordre d'assignació L'assignació de memòria és contínua . Memòria assignada a aleatòria ordre.
Seguretat de fils És segur per a fils perquè cada fil té la seva pròpia pila. No és segur per a fils, de manera que es requereix una sincronització correcta del codi.