Un breve análisis del área de datos durante la ejecución de la JVM y una comprensión profunda de la pila y el montón

Primero observe el diagrama de estructura de JVM: Para obtener
Inserte la descripción de la imagen aquí
una descripción general del cargador de clases, consulte este blog: JVM like loader

Por supuesto, antes de explicar el montón y la pila, primero comprendamos para qué se utilizan otras áreas del área de datos en tiempo de ejecución:

Pila de métodos nativos

La pila de métodos local sirve al método local. El idioma, el uso y la estructura de datos del método en la pila de métodos locales no son obligatorios en la especificación de la máquina virtual, por lo que la máquina virtual específica puede implementarlo libremente.
Aquí hay un ejemplo. Thread thread = new Thread(); thread.start();
Creo que debería estar familiarizado con este código. Cree un hilo y llame a su método de inicio. A continuación, haga clic en el código fuente del método de inicio.
Inserte la descripción de la imagen aquí
La capa inferior es para llamar al método start0 , y luego hacemos clic en el método start0 para ver cómo se escribe.
Inserte la descripción de la imagen aquí
Podemos ver que este método es modificado por el método nativo, que en realidad no es un método en el lenguaje Java.
La siguiente figura le ayuda a comprender el papel de la pila de métodos locales:
Inserte la descripción de la imagen aquí
así podemos simplemente entender que la pila de métodos locales almacena métodos modificados nativos (métodos que llaman a la interfaz), al igual que el método start0 en el ejemplo anterior.

Registro de PC

Inserte la descripción de la imagen aquí
¡Sólo entender!

Área de métodos

Inserte la descripción de la imagen aquí
¡Sólo entender!

Apilar

Primero observe la figura a continuación: Lo que
Inserte la descripción de la imagen aquí
se almacena en la pila son 8 variables de tipo básico + variables de referencia de objeto + métodos de instancia se asignan en la memoria de pila de la función.
A continuación, entendamos qué es un marco de pila:

Stack frame : se puede entender simplemente como un método en Java. Ponerlo en la pila se llama stack frame. Entonces, ¿qué está escrito en el stack frame?
Inserte la descripción de la imagen aquí
Si no comprende el texto anterior, puede mirar la siguiente imagen:
Inserte la descripción de la imagen aquí
el método add se llama en el método principal y el método de instancia mencionado anteriormente se coloca en la pila, por lo que el mian se coloca primero, seguido del método add, y las variables locales del método add, etc. Todos se almacenan en el marco de la pila.
Con la descripción anterior, no es difícil para nosotros entender el principio operativo de la pila, como se muestra en la figura siguiente: Después de
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
comprender el breve análisis anterior de la pila, echemos un vistazo a este error (Error) : java.lang.StackOverflowError, Desbordamiento de pila, ahora podemos entender si uno Si la función se llama a sí misma de forma recursiva sin terminar, seguirá agregándose a la pila hasta que la pila de Java esté llena.

montón

Montón : para la mayoría de las aplicaciones, el montón de Java es la mayor parte de la memoria administrada por la máquina virtual de Java. El montón de Java es un área de memoria compartida por todos los subprocesos y se crea cuando se inicia la máquina virtual. El único propósito de esta área de memoria es almacenar instancias de objetos, y casi todas las instancias de objetos asignan memoria aquí.
A continuación , veamos un breve análisis del montón:
Inserte la descripción de la imagen aquí
los estudiantes nuevos física y lógicamente van al área de retiro +.
Tenga en cuenta que después de JDK1.8, ¡el área permanente se convierte en un metaespacio!

La siguiente figura es un breve análisis del área recién nacida :
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
el concepto de área permanente:
Inserte la descripción de la imagen aquí
la diferencia entre la generación permanente y el metaespacio:
Inserte la descripción de la imagen aquí
A continuación, hablaré sobre el ajuste de los siguientes parámetros del montón (es decir, el ajuste de JVM):
Puede ver los parámetros del montón a través del siguiente código:
Inserte la descripción de la imagen aquí
el código se muestra a continuación:

long maxMemory = Runtime.getRuntime().maxMemory();//返回Java虚拟机试图使用的最大内存量。
           Long totalMemory = Runtime. getRuntime().totalMemory();//返回Java虚拟机中的内存总量。
           System.out.println("MAX_MEMORY ="+maxMemory +"(字节)、"+(maxMemory/(double)1024/1024) + "MB");
           System.out.println("TOTAL_ MEMORY = "+totalMemory +"(字节)"+(totalMemory/(double)1024/1024) + "MB");

¿Cómo configurar los parámetros a través de la idea y ver los detalles? El resultado de la impresión de
Editar-> Editar configuraciones
Inserte la descripción de la imagen aquí
combinado con el código anterior para ver los parámetros del montón es el siguiente:
Inserte la descripción de la imagen aquí
A continuación, veamos el error de que el montón está explotando, si asignamos una pequeña porción de memoria al montón de JVM a través del método anterior.
Inserte la descripción de la imagen aquí
Se informará un error: Se java.lang.OutOfMemoryErrorlanza cuando la máquina virtual Java no puede asignar un objeto debido a la memoria insuficiente y el recolector de basura ya no tiene memoria disponible.

La relación entre el área de pila, montón y método

Primero observe la figura a continuación. Los metadatos de la clase representan la plantilla de la clase en el método (la letra de estructura de la clase). Luego,
Inserte la descripción de la imagen aquí
mire la figura a continuación y combínela con la figura de arriba para entender: Los
Inserte la descripción de la imagen aquí
nuevos p1 y p2 se almacenan en la pila. Este es un tipo de referencia. Los nuevos objetos Person se almacenan en el montón, y estos objetos se obtienen del área de método de la información de estructura de la clase.

Supongo que te gusta

Origin blog.csdn.net/Pzzzz_wwy/article/details/106609188
Recomendado
Clasificación