Probar y explicar la alineación de la memoria (java)

Tamaño del objeto

 Se compone principalmente de 3 partes, incluido el encabezado del objeto, las variables de instancia y el llenado de memoria. como muestra la imagen:
Inserte la descripción de la imagen aquí

Nota:

  1. El encabezado del objeto está relacionado con la cantidad de máquinas virtuales. En una máquina virtual de 32 bits, el encabezado del objeto es de 8 bytes (incluido el puntero de clase de 4 bytes y MarkWord de 4 bytes. En una máquina virtual de 64 bits, el encabezado del objeto es de 16 bytes (incluido el puntero de clase de 8 bytes y 8 -byte MarkWord. Si la compresión de puntero de 64 bits está habilitada, el encabezado del objeto que almacena el puntero de clase es de 12 bytes (porque el puntero de clase está comprimido en 4 bytes)
  2. Los objetos de instancia se definen en la clase Varios tipos de contenido de campo. Por ejemplo:
Inserte la descripción de la imagen aquí
  3. Llenado de memoria : se utiliza para garantizar que el número de bytes (encabezado del objeto + variable de instancia) debe ser un múltiplo de 8.

Longitud del tipo de datos básico

Inserte la descripción de la imagen aquí

Vea el tamaño del objeto abierto en el montón:

Idea: La
 función mian se establece en un bucle infinito y la entidad correspondiente se puede encontrar antes de que finalice el programa. Genere el archivo de registro, puede ver el espacio ocupado.
Pasos:
  1. Utilice el Bloc de notas para crear dos nuevos archivos java y colóquelos en la misma ruta.
TestDemo.java

public class TestDemo{
    
    
	public static void main(String[] args){
    
    
		People p=new People();//注意P大写
		while (true){
    
    
		}
	}
}

  People.java

class People{
    
    
	int a;
	int b;
	int c;
	byte d;
}

  2. En el directorio de archivos java del cuadro de búsqueda, ingrese cmd, abra dos interfaces DOS de repuesto.
Inserte la descripción de la imagen aquí

  3. En el primer cmd: ingrese javac TestDemo.javay, a su vez, java TestDemocompile y ejecute el archivo java.
Inserte la descripción de la imagen aquí
  En el segundo cmd, ingrese jps(usado para ver el número de proceso de TestDemo) y jmap -histo:live 进程号>inform.log(generar archivo de registro) a su vez
Inserte la descripción de la imagen aquí

  4. A continuación, compruebe el archivo de información que se acaba de generar en el directorio donde se encuentra el archivo java.
Inserte la descripción de la imagen aquí

  5. Busque la palabra clave Personas para ver la cantidad de espacio abierto por la máquina virtual para esta categoría.
  6. Tenga en cuenta que TestDemo.java es un bucle sin fin. Después de obtener el archivo de registro, ingrese ctrl + c en la interfaz DOS para terminar el programa.
Inserte la descripción de la imagen aquí

Análisis de tamaño:

 Debido a la compresión del puntero, el encabezado del objeto tiene 12 bytes; hay 3 variables int y 1 byte en la clase People, un total de 4 * 3 + 1 = 13 bytes. 12 + 13 = 25 no es múltiplo de 8, el sistema llena su memoria con 7 , por lo que el tamaño total es 32.
 De hecho, el archivo de clase en la memoria se almacena en forma de flujo de bytes. Todos los datos de 16 bits, 32 bits y 64 bits se construyen y almacenan leyendo el espacio de memoria de 2bytes, 4bytes y 8bytes respectivamente. Los elementos de datos de varios bytes siempre se almacenan en orden alto, con el byte alto primero. Los tipos de datos más grandes long y double en Java ocupan 8 bytes , por lo que la memoria se asigna en unidades de los 8 bytes más grandes .

Beneficios de la alineación de la memoria

 1. Motivo de la plataforma (motivo del trasplante): no todas las plataformas de hardware pueden acceder a los datos en cualquier dirección. Algunas plataformas de hardware solo pueden obtener ciertos tipos de datos en determinadas direcciones; de lo contrario, se producirán excepciones de hardware
  2. Motivo del hardware: después de la alineación de la memoria, el diseño del procesador y la interfaz de memoria se simplifica y la velocidad de acceso a la memoria de la CPU se puede mejorar enormemente. Suponga que un procesador quiere leer 8 bytes de datos A de la memoria, la dirección de A debe ser un múltiplo de 8, de modo que se pueda usar una operación de memoria para leer o escribir esta A. De lo contrario, es posible que necesitemos realizar dos accesos a la memoria, porque A puede estar ubicado en dos bloques de memoria de 8 bytes.
 La alineación de la memoria es en realidad la idea de espacio para el tiempo. Después de todo, la CPU es órdenes de magnitud más rápida que la memoria.

Materiales de referencia:


¿Por qué es necesario alinear la memoria de la especificación de máquina virtual Java® ?
Reglas de alineación de
memoria Diseño de memoria de objetos
Comparación de velocidad de CPU y memoria

Supongo que te gusta

Origin blog.csdn.net/qq_41571459/article/details/113125973
Recomendado
Clasificación