Requisito previo: Strings en Java
Como sabemos, tanto el espacio Stack como Heap son parte de Java Virtual Machine (JVM) . Pero estos espacios de memoria se utilizan para diferentes propósitos. El espacio de pila contiene valores específicos que son de corta duración, mientras que el espacio de pila utilizado por Java Runtime para asignar memoria a objetos y clases JRE. En Java, las strings se almacenan en el área del montón.
¿Por qué las strings de Java se almacenan en Heap , no en Stack?
Bueno, String es una clase y las strings en Java se tratan como un objeto, por lo tanto, el objeto de la clase String se almacenará en Heap, no en el área de pila. Profundicemos en el tema. Como todos sabemos, podemos crear un objeto de string de dos maneras, es decir
1) Por string literal
2) Usando la palabra clave ‘nueva’
String Literal se crea usando una comilla doble. Por ejemplo:
String s=”Bienvenido”;
Aquí, la JVM verifica el conjunto de constantes de strings. Si la string no existe, se crea una nueva instancia de string y se coloca en el grupo. Si la string existe, entonces no creará un nuevo objeto, sino que devolverá la referencia a la misma instancia. El caché que almacena estas instancias de strings se conoce como grupo de strings constantes o grupo de strings. En versiones anteriores de Java hasta JDK 6, el grupo de strings estaba ubicado dentro del espacio PermGen (generación permanente). Pero en JDK 7 se mueve al área principal del montón.
¿Por qué el grupo de strings se movió de PermGen al área de almacenamiento dinámico normal?
El espacio de PermGen es un espacio limitado, el tamaño predeterminado es de solo 64 MB. Y fue un problema de crear y almacenar demasiados objetos de string en el espacio PermGen. Es por eso que el grupo de strings se mueve a un área de montón más grande. Para hacer que Java sea más eficiente en memoria, se utiliza el concepto de literal de string.
Mediante el uso de la palabra clave ‘nuevo’, la JVM creará un nuevo objeto de string en el área de montón normal incluso si el mismo objeto de string está presente en el grupo de strings.
Por ejemplo:
String a=nueva String(“Tridente”);
Echemos un vistazo al concepto con un programa Java y visualicemos la estructura de memoria JVM real:
Java
import java.io.*; class GFG { public static void main(String[] args) { // String created using String literal String s1 = "TAT"; String s2 = "TAT"; // String created using 'new' keyword String s3 = new String("TAT"); String s4 = new String("TAT"); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); } }
Producción:
TAT TAT TAT TAT
La siguiente figura ilustra el almacenamiento de String :
Aquí, en la figura anterior, la string se almacena en el grupo de constantes de strings. Las variables de referencia de objetos de string se almacenan en el área de la pila bajo el método main(). Como main() tiene algo de espacio en el área de la pila.
Nota:
- Todos los objetos en Java se almacenan en el montón. La variable de referencia al objeto almacenado en el área de la pila o puede estar contenida en otros objetos, lo que también los coloca en el área del montón.
- La string se pasa por referencia por java.
- Una variable de referencia de string no es una referencia en sí misma. Es una variable que almacena una referencia (dirección de memoria).
Publicación traducida automáticamente
Artículo escrito por Satyabrata_Jena y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA