Comprender el almacenamiento de métodos estáticos y variables estáticas en Java

En todos los lenguajes de programación, la memoria es un recurso vital y también escasea por naturaleza. Por lo tanto, es esencial que la memoria se administre a fondo sin fugas. La asignación y desasignación de memoria es una tarea crítica y requiere mucho cuidado y consideración. En este artículo, comprenderemos el almacenamiento de métodos estáticos y variables estáticas en Java. Java Virtual Machine (JVM) es un motor que proporciona un entorno de tiempo de ejecución para controlar el código Java. Convierte el código de bytes de Java en lenguaje de máquina. La JVM tiene dos funciones principales. Están:

  1. Permite que los programas Java se ejecuten en cualquier dispositivo o sistema operativo para cumplir con el principio WORA (Write Once Run Anywhere).
  2. Administra y optimiza la memoria del programa.

El administrador de memoria JVM crea grupos de memoria durante el tiempo de ejecución del programa. Comprendamos el concepto de grupos de memoria en Java. Hay dos tipos de grupos de memoria, a saber, la memoria de pila y la memoria de montón. La principal diferencia entre la memoria de pila y la memoria de montón es que la pila se usa para almacenar solo los tipos de datos pequeños, mientras que el montón almacena todas las instancias de la clase. Y, dado que java implícita o explícitamente extiende la clase de Object.class, cada clase que creamos es una colección de objetos. Esto también significa que no podemos usar un método o una variable a menos que lo instanciamos con una nueva palabra clave. Tan pronto como instanciamos los métodos, JVM asigna algo de memoria en el montón y almacena la dirección de la instancia en la pila. Después de esto, se pueden utilizar los métodos y las variables. Para comprender mejor cómo funciona la nueva palabra clave, tomemos un ejemplo. Tomemos una clase de aves. Cada vez que se encuentra un nuevo pájaro, se debe incrementar el número de pájaros. Intentemos implementar este código: 

Java

// Java program to demonstrate the above example
 
public class Bird {
    private String name;
    private int number;
 
    Bird(String name)
    {
        this.name = name;
        number++;
    }
 
    public void fly()
    {
        System.out.println(
            "This bird flies");
    }
 
    public int getNumber()
    {
        return number;
    }
 
    public String getName()
    {
        return name;
    }
}
 
class GFG {
    public static void main(String args[])
    {
        Bird b1 = new Bird("Parrot");
        Bird b2 = new Bird("Sparrow");
        Bird b3 = new Bird("Pigeon");
 
        System.out.println(b1.getNumber());
    }
}
Producción:

1

Claramente, este método no se puede usar para contar la cantidad de pájaros porque en cada instancia, se asigna un montón nuevo y para todas las instancias, la cantidad de aves se inicializa desde 0 y se incrementa a 1. Por lo tanto, estamos creando tres pájaros independientes donde, en cada objeto pájaro, el número de pájaros es 1. Para evitar esto, inicializamos los métodos y variables como estáticos . Esto significa que la variable o el método no se cambia para cada creación de un nuevo objeto. Dado que estos métodos y variables no se pueden almacenar en un montón normal, se almacenan en un área especial llamada generación permanente (PermGen) .

La principal diferencia es que el montón es el espacio de crecimiento automático, con la memoria RAM como sus restricciones, mientras que PermGen tiene una asignación de espacio fija, y esto se comparte con todas las instancias.

Implementemos esto cambiando el número a una variable estática. 

Java

// Java program to demonstrate the above example
 
public class Bird {
    private String name;
    private static int number;
 
    Bird(String name)
    {
        this.name = name;
        number++;
    }
 
    public void fly()
    {
        System.out.println("This bird flies");
    }
 
    public int getNumber()
    {
        return number;
    }
 
    public String getName()
    {
        return name;
    }
}
 
class GFG {
    public static void main(String args[])
    {
        Bird b1 = new Bird("Parrot");
        Bird b2 = new Bird("Sparrow");
        Bird b3 = new Bird("Pigeon");
 
        System.out.println(b1.getNumber());
    }
}
Producción:

3

Nota: En Java 5 y 6, se utilizó el espacio PermGen. Pero debido a cambios importantes en el modelo de memoria en Java 8, la especificación de almacenamiento también cambió. Ahora se ha introducido un nuevo espacio de memoria » MetaSpace » donde se almacenan todos los campos de nombres de la clase, métodos de una clase con el código de byte de métodos, grupo constante, optimizaciones JIT. La razón principal de este cambio de PermGen en Java 8.0 es que es difícil predecir el tamaño de PermGen y ayuda a mejorar el rendimiento de la recolección de elementos no utilizados.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *