Área de memoria JVM y proceso de carga de clases

Área de datos en tiempo de ejecución

Contador de programa

Es privado para el hilo. El contador del programa es una pequeña parte de la memoria. Se puede considerar como una instrucción simbólica del código de bytes ejecutado por el hilo actual. Es un indicador del flujo de control del programa, bifurcaciones, bucles, saltos, y manejo de excepciones Las funciones básicas como la recuperación de subprocesos, etc., deben depender de este contador para completarse.

Pila de máquinas virtuales Java

Cuando se ejecuta cada método, se llama a un marco de pila (una estructura de datos básica importante cuando el método se está ejecutando) para almacenar información como la tabla de variables locales, la pila de operandos, el enlace dinámico y la salida del método. Después de que se llama a cada método, se considera el proceso de este marco de pila desde el estallido al apilado. La tabla de variables locales almacena los tipos básicos, referencias de objetos y tipos returnAddress de varias máquinas virtuales Java conocidas en tiempo de ejecución (apuntando a la dirección de una instrucción de código de bytes). El espacio de almacenamiento de estos tipos de datos en la tabla de variables locales está representado por una ranura de variable local. El de 64 bits de longitud y el doble ocupan dos ranuras y los demás ocupan una ranura.

Pila de métodos nativos

	为虚拟机栈使用到本地的方法服务 

Montón de Java

	线程共享区,是虚拟机中所管理的最大的一块区域,此堆的唯一目的就是在jvm启动的时候存放实例。几乎所有的实例对象都在这分配内存。是垃圾回收器管理的内存区域,所以通常来说还分为新生代(From Survivor、To Survivor、Eden空间)、老年代,这样能够更好的回收内容。配置Java堆的大小可以通过参数-Xmx和-Xms设定。如果Java堆中没有内存完成实例的分配,且无法再进行扩展,这时jvm就将抛出OOM异常。

Área de métodos

Área compartida de subprocesos. Se utiliza para almacenar datos como información de tipo, constantes, variables estáticas y caché de código después de la compilación justo a tiempo que ha sido cargada por jvm. El área de método antes de jdk8 también se llama generación permanente. Sin embargo, después de 1.8, jvm abandonó por completo el concepto de generación permanente y lo reemplazó con metaespacio implementado en la memoria local. Mueva todo el contenido restante (principalmente información de tipo) en jdk7 de la generación permanente al metaespacio. Si el área de método no puede cumplir con los nuevos requisitos de asignación de memoria, se producirá un error de oom.

Grupo de constantes en tiempo de ejecución

	是方法区的一部分,class文件除了有版本、字段、方法、接口等信息外,还有一个常量池表,用于存放编译时产生的各种字面量和符号引用。当常量池无法再分配到内存时会抛出oom error。 

La forma en que carga la clase

imagen-20200501001426467

Ahora describamos el proceso de carga de clases en palabras:

En general, la forma de crear un objeto es la nueva palabra clave (otras como clon, deserialización) .Cuando la máquina virtual interpreta la nueva instrucción, primero verificará si el parámetro de esta instrucción existe en el grupo constante y si existe, determinará si se ha cargado, analizado e inicializado. De lo contrario, se realizará la carga de clases.

A continuación, la memoria se asignará en el montón y la asignación de memoria también se dividirá en dos situaciones. La primera es que la memoria está en un estado regular, en este caso, el puntero del área de memoria asignará un área tan grande como el objeto. Otro tipo de irregularidad, es decir, el área utilizada y el área no utilizada se superponen, en este momento la máquina virtual mantendrá una lista para almacenar el área disponible. Cuando se asigna la memoria, se puede encontrar un área lo suficientemente grande en la lista para asignarla a la instancia.

Por supuesto, esto es solo en circunstancias normales, en circunstancias concurrentes, no es seguro para subprocesos. El problema de ABA es propenso a ocurrir, aquí jvm proporciona dos soluciones. El primer tipo: sincronizar la acción de asignar espacio, es decir, para garantizar la seguridad de los subprocesos a través de CAS + reintento de falla. El segundo tipo: la máquina virtual divide las diferentes áreas operativas de acuerdo con los subprocesos (búfer de asignación de subprocesos local: TLAB). Cuando cada subproceso realiza la asignación de memoria, primero se asignará en el área operativa dividida. Cuando se asigna este área de búfer Después de eso, realice la operación de sincronización nuevamente.

Cuando se asigna la memoria, la máquina virtual inicializará el espacio de memoria asignado (incluido el encabezado del objeto) a 0.

Ubicación de acceso a objetos

Dividido en dos formas:

  • Manejar el acceso

    Para el acceso de identificador, el montón de Java se puede dividir en un área como el grupo de manejadores, y el tipo de referencia almacena la dirección de identificador del objeto de almacenamiento. El segundo identificador contiene las direcciones específicas de los datos y tipos de datos de la instancia de objeto.

    La ventaja es que la referencia almacena una dirección de identificador estable, que no se verá afectada por el objeto movido por el recolector de basura. Solo cambiará el puntero de datos de instancia en el identificador y no es necesario modificar la referencia.

  • Acceso al puntero

    El diseño de la memoria del objeto en el montón de Java debe considerar cómo colocar la información relevante sobre los datos del tipo de acceso, y la dirección del objeto se almacena directamente en la referencia. Si accede directamente al objeto en sí, no hay necesidad de una sobrecarga de acceso indirecto adicional.

    La mayor ventaja es una velocidad más rápida Dado que el acceso a objetos es muy frecuente en Java, los ahorros de velocidad también son considerables.

Referencias: "Conocimiento profundo de la máquina virtual Java"

Supongo que te gusta

Origin blog.csdn.net/pengyiccb/article/details/105873199
Recomendado
Clasificación