Desbordamiento de pila de Jvm y desbordamiento de pila
Uno, desbordamiento del montón de jvm
1. Introducción
Al ejecutar un programa java en jvm, si la memoria requerida por el programa es mayor que la memoria de pila máxima del sistema (-Xmx), se producirá un problema de desbordamiento de pila.
2. Caso
// Introducción: La ejecución de este código requiere más de 10 m de espacio de memoria public class HeadOverflow { public static void main (String [] args) { List <Object> listObj = new ArrayList <Object> (); for (int i = 0; i <10; i ++) { Byte [] bytes = new Byte [1 * 1024 * 1024]; listObj.add (bytes); } System.out.println ("Agregar éxito"); } } // Establecer el jvm del programa Información de parámetros -Xms1m -Xmx10m -XX: + PrintGCDetails -XX: + HeapDumpOnOutOfMemoryError Memoria de pila inicial y memoria de pila máxima Gc información de registro detallada
3. Resumen
En el entorno de implementación formal del proyecto, el programa lee la memoria del sistema de forma predeterminada. Generalmente, la memoria de pila inicial (-Xms) del programa se establece en == la memoria de pila máxima disponible (-Xmx).
Dos, desbordamiento de pila de jvm
1. Introducción
a. La profundidad de la pila solicitada por el hilo es mayor que la profundidad máxima permitida por la máquina virtual StackOverflowError
b. Cuando la máquina virtual expande la profundidad de la pila, no puede solicitar suficiente espacio de memoria. OutOfMemoryError
Comprensión: cada llamada de método tendrá un marco de pila insertado en la pila de la máquina virtual. El sistema operativo asigna memoria limitada a la JVM y la JVM asigna memoria limitada a la "pila de la máquina virtual". Si hay demasiadas llamadas a métodos, la pila de la máquina virtual se desbordará cuando la pila esté llena. Aquí, la profundidad de la pila se refiere al número de marcos de pila. https://www.cnblogs.com/lovlife/articles/12452502.html
2. Caso
// Circula recursivamente, hasta que alcanza la profundidad máxima de jvm public class StackOverflow { Private static int count; public static void count () { try { count ++; count (); } catch (Throwable e) { System.out.println ( "Profundidad máxima:" + recuento); e.printStackTrace (); } } public static void main (String [] args) { count (); } }
Ajustar el tamaño de la pila de jvm
C: \ Users \ rocky fang \ Documents \ mycode> java -Xss2m -cp "C: \ Users \ rocky fang \ Documents \ mycode" JavaStackTest
java.lang.StackOverflowError
altura de pila: 23345
C: \ Users \ rocky fang \ Documents \ mycode> java -Xss5m -cp "C: \ Users \ rocky fang \ Documents \ mycode" JavaStackTest
java.lang.StackOverflowError
altura de pila: 93213
C: \ Users \ rocky fang \ Documents \ mycode> java -Xss10m -cp "C: \ Users \ rocky fang \ Documents \ mycode" JavaStackTest
java.lang.StackOverflowError
altura de pila: 423618
Set-Xss5m para llamar después de establecer la profundidad máxima de llamada
Resumen: Cada computadora tendrá un límite máximo de profundidad de llamada para evitar bucles infinitos de recursividad en el código.
Cuanto mayor sea el contenido de la tabla de variables locales, mayor será el marco de la pila y menor la profundidad de la pila.
Tres, desbordamiento de memoria y pérdida de memoria
1. Diferencias
: desbordamiento de memoria: solicite espacio de memoria, excediendo el espacio máximo de memoria de pila.
Fuga de memoria: de hecho incluye desbordamiento de memoria, el espacio de memoria del montón está ocupado por objetos inútiles y no se libera en el tiempo, lo que lleva a la ocupación de memoria y finalmente a pérdidas de memoria.
Situación: objetos modificados estáticamente.
Solución: reduzca la definición de constantes (consulte la memoria del servidor para obtener más detalles)