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.
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.
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 | Té més ràpid accés, assignació i desassignació. | Té 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. |