Cuando una persona comienza a aprender Java u otros lenguajes de programación, entrará en contacto con el montón y la pila. Dado que al principio no hay una explicación clara, muchas personas tendrán muchas preguntas sobre qué es el montón. ¿Qué es la pila y cuál es la diferencia entre montón y pila? Lo que es peor es que hay una pila en Java, una estructura de datos secuencial de último en entrar, primero en salir, que es java.util.Stack. En este caso, inevitablemente confundirá más a muchas personas acerca de la pregunta anterior. De hecho, el montón y la pila son partes de la memoria y tienen funciones diferentes, y un programa necesita asignar memoria en esta área. Como todos sabemos, todos los programas Java se ejecutan dentro de la máquina virtual JVM. Lo que presentamos aquí es, naturalmente, el montón y la pila en la memoria JVM (virtual).
la diferencia
La diferencia entre montón y pila en Java es, naturalmente, una pregunta común en las entrevistas. Los siguientes puntos son las diferencias específicas.
Cada uno cumple con sus deberes.
La principal diferencia es que la memoria de pila se utiliza para almacenar variables locales y llamadas a métodos.
La memoria del montón se utiliza para almacenar objetos en Java. Ya sean variables miembro, variables locales o variables de clase, los objetos a los que apuntan se almacenan en la memoria del montón.
Exclusivo o compartido
La memoria de la pila pertenece a un solo hilo, cada hilo tendrá una memoria de pila y las variables que almacena solo pueden ser visibles en el hilo al que pertenece, es decir, la memoria de la pila puede entenderse como la memoria privada del hilo.
Los objetos en la memoria del montón son visibles para todos los subprocesos. Todos los subprocesos pueden acceder a los objetos en la memoria del montón.
error de excepción
Si no hay espacio disponible en la memoria de la pila para almacenar llamadas a métodos y variables locales, la JVM generará java.lang.StackOverFlowError.
Y si no hay espacio disponible en la memoria del montón para almacenar el objeto generado, la JVM arrojará java.lang.OutOfMemoryError.
Tamaño del espacio
La memoria de la pila es mucho más pequeña que la memoria del montón. Si usa la recursividad, su pila se llenará rápidamente. Si la recursividad no se interrumpe a tiempo, es probable que se produzca un problema de StackOverFlowError.
Puede configurar el tamaño de la memoria de la pila con la opción -Xss. La opción -Xms establece el tamaño inicial del montón y la opción -Xmx establece el tamaño máximo del montón.
Ésta es la diferencia entre montón y pila en Java. Si comprende bien este problema, puede ayudarlo a resolver problemas de desarrollo, analizar la memoria del montón y el uso de la memoria de la pila, e incluso realizar ajustes del rendimiento.
Ver valor predeterminado (actualizado)
Para ver el valor predeterminado del montón, utilice el siguiente código, donde InitialHeapSize es el tamaño del montón inicial y MaxHeapSize es el valor máximo del montón.
Copie el código de código de la siguiente manera:
13:17 $ java -XX:+PrintFlagsFinal -version | grep HeapSize
uintx ErgoHeapSizeLimit = 0 {producto}
uintx HeapSizePerGCThread = 87241520 {producto}
uintx Tamaño del montón inicial: = 134217728 {producto}
uintx LargePageHeapSizeThreshold = 134217728 {producto}
uintx MaxHeapSize: = 2147483648 {producto}
versión de Java "1.8.0_25"
Entorno de ejecución Java(TM) SE (compilación 1.8.0_25-b17)
VM de servidor Java HotSpot(TM) de 64 bits (compilación 25.25-b02, modo mixto)
Verifique el valor predeterminado de la pila, donde ThreadStackSize es el tamaño de la memoria de la pila.
Copie el código de código de la siguiente manera:
13:21 $ java -XX:+PrintFlagsFinal -versión | grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd producto}
intx ThreadStackSize = 1024 {pd producto}
intx VMThreadStackSize = 1024 {pd producto}
versión de Java "1.8.0_25"
Entorno de ejecución Java(TM) SE (compilación 1.8.0_25-b17)
VM de servidor Java HotSpot(TM) de 64 bits (compilación 25.25-b02, modo mixto)
Información de traducción
Texto original en inglés: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
La traducción ha sido modificada, organizada y eliminada en base al texto original. Si estás interesado, puedes visitar el texto original. La dirección de PS ha sido bloqueada.