¿Qué es la asignación de memoria en Java? Memoria de pila y montón



Este artículo basado en 'Asignación de memoria en Java' le ayudará con un conocimiento detallado sobre la asignación de memoria junto con las estructuras de datos Stack y Heap.

Asignación de memoria es un proceso mediante el cual los programas y servicios informáticos se asignan con funciones físicas o virtuales. memoria espacio. En este artículo, aprenderemos sobre la asignación de memoria en y hablaremos de Stack y Heap Memory.

¿Qué es la memoria de pila?

La memoria Java Stack se utiliza para la ejecución de un hilo. Contienen valores específicos del método que son de corta duración y referencias a otros objetos en el montón al que se hace referencia desde el método.





Apilar siempre se hace referencia a la memoria en LIFO (último en entrar, primero en salir) orden. Siempre que se invoca un método, se crea un nuevo bloque en la memoria de pila para que el método contenga valores primitivos locales y haga referencia a otros objetos en el método.

Tan pronto como finaliza el método, el bloque deja de utilizarse y está disponible para el siguiente método.



convertir doble a int java

El tamaño de la memoria de pila es muy inferior en comparación con la memoria Heap.

Características clave de la memoria de pila

Aparte de lo que hemos discutido hasta ahora, a continuación se presentan algunas otras características de Apilar memoria:

  • Crece y se encoge a medida que se llaman y devuelven nuevos métodos, respectivamente.
  • Las variables dentro de la pila existen solo mientras se esté ejecutando el método que las creó
  • Sus automáticamente asignado y desasignado cuando el método termina la ejecución
  • Si esta memoria está llena, Java arroja java.lang.StackOverFlowError
  • El acceso a esta memoria es rápido en comparación con la memoria del montón
  • Este recuerdo es a salvo de amenazas ya que cada hilo opera en su propia pila

Métodos en la clase Stack

  • Empuje de objeto ( Elemento de objeto ): Empuja un elemento en la parte superior de la pila.
  • Objeto emergente (): Elimina y devuelve el elemento superior de la pila. Un 'EmptyStackException' se lanza una excepción si llamamos a pop () cuando la pila de invocación está vacía.
  • Vistazo de objeto (): Devuelve el elemento en la parte superior de la pila, pero no lo elimina.
  • Booleano vacío (): Devuelve verdadero si no hay nada en la parte superior de la pila. De lo contrario, devuelve falso.
  • int búsqueda Elemento de objeto ): Determina si un objeto existe en la pila. Si se encuentra el elemento, devuelve la posición del elemento desde la parte superior de la pila.. De lo contrario, devuelve -1.

Código Java para implementación de pila

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {for (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) } } 

//Salida



memory-allocation-in-java

Ahora, vayamos a Heap Space.

Heap Space en Java

La memoria se asigna durante la ejecución de instrucciones escritas por programadores. Tenga en cuenta que el nombre del montón no tiene nada que ver con la estructura de datos del montón. Se llama montón porque es un montón de espacio de memoria disponible para que los programadores asignado y de-allocate. Si un programador no maneja bien esta memoria, una pérdida de memoria puedesuceder en el programa.

Características clave de Java Heap Memory

  • Además de lo que hemos discutido hasta ahora, a continuación se presentan algunas otras características del espacio de pila:
  • Se accede a él a través de complejas técnicas de gestión de memoria que incluyen Generación joven, vieja o Generación Titular, y Generación permanente
  • Si el espacio del montón está lleno, Java lanza java.lang.OutOfMemoryError
  • El acceso a esta memoria es relativamente más lento que la memoria de pila
  • Esta memoria, a diferencia de la pila, no se desasigna automáticamente. Necesita Recolector de basura para liberar objetos no utilizados para mantener la eficiencia del uso de la memoria
  • A diferencia de la pila, un montón no es a salvo de amenazas y necesita ser protegido sincronizando correctamente el código

Diferencia entre Java Heap Space y Stack Memory

Con base en las explicaciones anteriores, podemos concluir fácilmente las siguientes diferencias entre Montón y Apilar memoria.

  • Montón la memoria es utilizada por todas las partes de la aplicación, mientras que la memoria de pila es utilizada solo por un hilo de ejecución.
  • Siempre que se crea un objeto, siempre se almacena en el espacio de pila y la memoria de pila contiene la referencia a él. La memoria de pila solo contiene variables primitivas locales y variables de referencia a los objetos en el espacio del montón.
  • Los objetos almacenados en el montón son accesibles globalmente, mientras que otros subprocesos no pueden acceder a la memoria de la pila.
  • La gestión de la memoria en la pila se realiza en LIFO de manera que es más complejo en la memoria Heap porque se usa globalmente. La memoria del montón se divide en Generación joven, generación anterior etc, más detalles en Java Garbage Collection.
  • La memoria de pila es efímero mientras que la memoria del montón vive desde el principio hasta el final de la ejecución de la aplicación.
  • Nosotros podemos usar -XMX y -XMS Opción JVM para definir el tamaño de inicio y el tamaño máximo de la memoria de pila. Nosotros podemos usar -XSS para definir el tamaño de la memoria de la pila.
  • Cuando la memoria de pila está llena, el tiempo de ejecución de Java arroja java.lang.StackOverFlowError mientras que si la memoria del montón está llena, arroja java.lang.OutOfMemoryError: Espacio de montón de Javaerror.
  • El tamaño de la memoria de pila es muy inferior en comparación con la memoria de pila. Debido a la simplicidad en la asignación de memoria (LIFO), la memoria de pila es muy rápida en comparación conmontón de memoria.

Cuadro comparativo

PARÁMETRO APILAR MONTÓN
Básico La memoria se asigna en un bloque contiguoLa memoria se asigna en un orden aleatorio
Asignación y desasignación Automático por compiladorManual por programador
Costo MenosMás
Implementación DifícilFácil
Tiempo de acceso Más rápidoMás lento
Tema principal Escasez de memoriaFragmentación de la memoria
Localidad de diferencia ExcelenteAdecuado
Flexibilidad Tipo de interés fijoCambiar el tamaño es posible

Con esto, llegamos al final de este Tutorial de “Asignación de memoria en Java”. Espero que haya entendido el concepto y su implementación a través de algunos ejemplos en tiempo real.

Ahora que has entendidoAsignación de memoria en Javaconceptos básicos a través de este artículo 'Asignación de memoria en Java', consulte el por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. Los cursos de formación y certificación Java J2EE y SOA de Edureka están diseñados para estudiantes y profesionales que desean ser desarrolladores de Java. El curso está diseñado para darle una ventaja en la programación de Java y capacitarlo para los conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Primavera .

Tienes una pregunta para nosotros? Menciónalo en la sección de comentarios de este blog de “Asignación de memoria en Java” y nos comunicaremos contigo lo antes posible.