El artículo lleva a entender la cantidad de memoria que escribe objetos Java en realidad representaba?

navegación de páginas blog personal (haga clic a la derecha de enlace para abrir un blog personal): Daniel lo lleve en la pila de tecnología 

Java modelo de memoria cabecera del objeto

Vamos a echar un vistazo a un objeto de modelo de memoria de Java es una especie de cómo? Desde nuestra máquina virtual se divide en 32 bits y de 64 bits, es sin duda su modelo es diferente, he hecho una lista en la columna de la máquina virtual de la máquina virtual de 32 bits y de 64 bits Javamodelo de memoria cabecera del objeto. # 32

# 64

compresión de puntero de 64 bits

Debido a que el autor del medio ambiente local jdk1.8, de 64 bits máquina virtual, estoy aquí a 64 máquinas virtuales (compresión puntero abierta) para analizar, ya que por defecto, jdk1.8 la compresión de 64 bits máquina virtual está activada por defecto para punteros.

cabecera del objeto de Java se compone de dos partes, la primera parte es  Mark Word, se trata de la  Java realización del principio de bloqueo en una parte importante de la otra parte  Klass Word.

Klass Palabra  aquí es en realidad una máquina virtual diseñado oop-klass modelmodelo, aquí OOPse refiere a la Ordinary Object Pointer(puntero de objeto común), se ve como un puntero es en realidad oculta en el puntero en el objeto. klass que contiene metadatos y métodos, para describir la  Java clase. espacio abierto bajo sus 32bits ocupación punteros de compresión en el entorno de máquina virtual de 64 bits.

Marca verbal  es el foco de nuestro análisis, este conocimiento será diseñado para bloquear. Mark Word 64bits ocupan espacio en el entorno de máquina virtual de 64 bits. Toda la Mark Wordasignación Hay varias situaciones:

  1. Desbloqueado (Normal):  código hash ( identity_hashcode) ocupa 31bits, la edad generacional ( age) ocupa 4 bits, el modo de polarización ( biased_lock) ocupa 1 bits, un indicador de bloqueo ( lock) ocupa 2 bits, 26bits restantes no utilizada (es decir, todo 0)
  2. Pueden estar sesgados (sesgada):  ID del tema representó 54bits, epoch que representa el 2 bits, la edad generacional ( age) ocupa 4 bits, modo sesgado (biased_lock) ocupa 1 bits, un indicador de bloqueo (lock) ocupa 2 bits, 1 bit de la restante no utilizada.
  3. bloqueo de peso ligero (liviano el Locked) : un puntero cerrojo ocupa 62bits, indicador de bloqueo ( lock) ocupa 2 bits.
  4. cerraduras de peso pesado peso pesado (bloqueado) : un puntero cerrojo ocupa 62bits, indicador de bloqueo ( lock) ocupa 2 bits.
  5. marca de GC : 2bits bandera representaron, el resto es vacía (es decir, llenando 0)

Estos son nuestra determinación de modelo de memoria de Java cabecera del objeto, siempre y cuando un objeto Java, entonces ciertamente incluir un encabezado de objeto, lo que significa que esta parte de la huella de la memoria es inevitable. Bajo Así, en mi máquina virtual de 64 bits, Jdk1.8 (compresión puntero abierto) medio ambiente, cualquier objeto, lo que no se debe hacer, siempre y cuando la declaración de una clase, entonces su consumo de memoria en al menos 96bits, que es al menos 12 bytes.

Modelo de verificación

Echemos un vistazo a algo de código para validar el modelo de memoria anterior, se recomienda aquí OpenJDK de herramienta jol , que puede ayudar a ver la memoria de destino de ocupación.

En primer complemento dependiente de Maven

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
        </dependency>

Vamos a echar un vistazo, aunque sólo sea para crear una clase común, lo que no añada atributos, cuánto espacio está ocupado?

/**
 * @description:
 * @author: luozhou
 * @create: 2020-02-26 10:00
 **/
public class NullObject {

}

De acuerdo con nuestro análisis anterior modelo de memoria de Java objeto, un objeto vacío, es sólo la cabeza de un sujeto, bajo la condición de puntero de compresión se ocupará de 96 bits, que es 12byte.

herramienta de correr al espacio ocupado vista

 public static void main(String[] args) {
        System.out.println(ClassLayout.parseInstance(new NullObject()).toPrintable());
    }

La línea anterior de código analiza NullObject se crea un nuevo objetivo, la cantidad de memoria. Vamos a ver cómo la aplicación de los resultados: huella de la memoria

Aquí encontramos los resultados muestran: Instance size:16 bytesel resultado es de 16 bytes, nuestro pronóstico anterior de 12 bytes no son lo mismo, ¿por qué es esto así? Vemos la figura de arriba hay tres cabecera del objeto filas, cada una ocupando 4 bytes, por lo que la cabeza es de 12 bytes, y esto es consistente con nuestros cálculos, la última línea es una máquina virtual lleno de 4 bytes, entonces ¿por qué virtuales relleno confidencial cuatro bytes de la misma?

La alineación de memoria

¿Quieres saber por qué la máquina virtual está lleno de 4 bytes, tenemos que entender lo que es la alineación de memoria?

Buscamos memoria del programador es la siguiente:

La figura muestra un modo de realización una memoria de lectura rábano hoyo. Pero, de hecho, la CPU no va con una lectura de memoria un byte y escritura. En cambio, la memoria es un CPU lee un tamaño de bloque de lectura y similares puede ser 2,4,6,8,16 tamaño en bytes. Llamamos a este tamaño de bloque de acceso a la memoria granularidad. La figura siguiente:

Supongamos que la CPU de una plataforma de 32 bits, entonces se irá a un tamaño de partícula de 4 bytes leídos bloque de memoria. ¿Por qué necesitamos la memoria align? Hay dos razones principales:

  • Plataforma (portabilidad) razones: No todas las plataformas de hardware son capaces de acceder a los datos en cualquier dirección. Por ejemplo: una plataforma de hardware específica sólo permite obtener determinados tipos de datos en una dirección específica, de lo contrario, dará lugar a una situación anormal.
  • Por motivos de rendimiento: Si un acceso de memoria no alineada dará lugar a dos veces el acceso a la memoria de la CPU, y tomar ciclos de reloj adicionales a la alineación y la operación del proceso. Y se alineó requiere sólo un acceso a la memoria para completar la operación de lectura.

He utilizado la leyenda para explicar el proceso de la CPU a la memoria de acceso no alineado:

En la figura, suponiendo una lectura CPU es de 4 bytes, 8 bytes en este espacio de memoria continuo, si mi datos no está alineado, la dirección almacenada en los bloques de memoria 1,2,3,4, y que lee la CPU va a requerir de dos a leer, además de las operaciones computacionales adicionales:

  1. CPU lee primero el primer bloque de direcciones de memoria desalineado, lee el byte 0-3. Y retirar los bytes 0.
  2. CPU lee la dirección de memoria desalineada del segundo bloque de nuevo, 4-7 bytes leídos. 5,6,7 y retirar los bytes de bytes.
  3. Los combinados 1-4 bytes de datos.
  4. Fusionado en el registro.

Por lo tanto, ninguna alineación de memoria hará que la CPU adicional operación de lectura, y requiere cálculos adicionales. Si usted hace una alineación de memoria, CPU puede comenzar a leer directamente desde la dirección 0, una vez que los datos que desea leer, no hay operaciones de lectura adicionales y operaciones aritméticas, ahorra el tiempo de ejecución. Utilizamos el espacio por el tiempo, por lo que tenemos que estar alineados memoria.

Volver vacío de Java objetos llenos de cuatro bytes del problema, porque el encabezado de bytes original es 12 bytes, máquinas de 64 bits, memoria de palabras alineación es 128, que es de 16 bytes, por lo que también es necesario para llenar cuatro palabras sección.

cálculo de la huella de memoria del objeto no nulo

Sabemos que un objeto vacío es ocupar 16 bytes, un objeto no nulo con exactitud la cantidad de bytes que ocupa? Todavía escribir bajo una categoría general para verificar:

public class TestNotNull {
    private NullObject nullObject=new NullObject();
    private int a;
}

Esta clase de demostración introdujo otros objetos, sabemos que intel tipo es de 4 bytes, NullObjectel objeto ocupa 16 bytes, cuentas de cabecera del objeto de 12 bytes, hay un caso muy importante  NullObjectes una referencia en la clase actual, por lo objeto real no existe, pero sólo mantener la dirección de referencia , la dirección de referencia ocupa 4 bytes, el total es de 12 + 4 + 4 = 20 bytes, la alineación de memoria es de 24 bytes. No estamos bajo para verificar este resultado:

public static void main(String[] args) {
        //打印实例的内存布局
        System.out.println(ClassLayout.parseInstance(new TestNotNull()).toPrintable());
        //打印对象的所有相关内存占用
        System.out.println(GraphLayout.parseInstance(new TestNotNull()).toPrintable());
        //打印对象的所有内存结果并统计
         System.out.println(GraphLayout.parseInstance(new TestNotNull()).toFootprint());
    }

Los resultados son como sigue:

Podemos ver TestNotNullel espacio de la clase es de 24 bytes, que ocupa 12 bytes de cabecera, la variable aes intel tipo ocupe 4 bytes, la variable nullObjectestá referenciada, ocupa 4 bytes, y finalmente llena de cuatro bytes, para un total de 24 bytes, de conformidad con la previsión anterior. Sin embargo, debido creamos una instancia NullObjectde este objeto en la memoria durante un tiempo, por lo que hay que añadir 16 bytes de espacio de memoria de este objeto, que es un total de 24bytes + 16 bytes = 40 bytes. Los resultados finales de nuestra impresión estadística la cifra es de 40 bytes, por lo que nuestro análisis es correcto.

Esta es también la forma de analizar la cantidad de memoria está ocupada la idea de un objeto real, de acuerdo con esta línea de pensamiento, más OpenJDK de herramienta jol, básicamente, puede escribir su propia comprensión del "objeto" Prodigal exactamente cuánta memoria.

resumen

Este artículo se centra en cómo me analizar la cantidad de espacio de memoria en realidad está ocupado por un objeto Java, los puntos principales se resumen de la siguiente manera:

  1. Java modelo de objetos en la cabeza 32 máquinas virtuales de memoria y la máquina virtual de 64 bits no es lo mismo, 64-bit máquina virtual se divide en puntero del puntero del modelo de la cabeza de compresión de compresión abiertos y no abiertos dos tipos de objetos, por lo que un total de tres tipos de objetos Modelo de la cabeza .
  2. alineación de memoria se debe principalmente a razones de rendimiento y plataformas, este trabajo es resolver cuestiones de rendimiento.
  3. objeto cálculo de la huella de memoria vacía Para calcular la memoria atención alineación, la memoria, el cálculo de una referencia de objeto no nulo más la atención y el espacio ocupado por la huella de la instancia objeto original.

aprendizaje adjunta Java / C / C ++ / máquina / Algoritmos y Estructuras de Datos / front-end / Android / Python / programador de lectura / libros individuales libros Daquan:

(Haga clic en la derecha para abrir allí en el blog personal en seco): seca Técnica de floración
===== >> ① [Java Daniel lo lleve en el camino a avanzado] << ====
===== >> ② [+ acm algoritmo de estructura de datos Daniel lo lleve en el camino a avanzado] << ===
===== >> ③ [base de datos de Daniel lo lleve en el camino a avanzado] << == ===
===== >> ④ [Daniel cliente web para llevarlo en el camino a avanzado] << ====
===== >> ⑤ [pitón máquina de aprendizaje y Daniel le llevará a la entrada camino avanzada] << ====
===== >> ⑥ [arquitecto Daniel lo lleve en el camino a avanzado] << =====
===== >> ⑦ [C ++ Daniel avanzó para llevarlo en el camino] << ====
===== >> ⑧ [ios Daniel lo lleve en el camino a avanzado] << ====
=====> > ⑨ [seguridad web Daniel lo lleve en el camino a avanzado] << =====
===== >> ⑩ [sistema operativo Linux y Daniel se toman en el camino a avanzado] << = ====

No hay frutas consumidas, espero que jóvenes amigos, amigos desea aprender técnicas, superando todos los obstáculos en el camino de la carretera determinada para atar en la tecnología, entender el libro, y luego golpear en el código, entender el principio, e ir a la práctica, se se le dan vida, su trabajo, su futuro un sueño.

Publicado 47 artículos originales · ganado elogios 0 · Vistas 268

Supongo que te gusta

Origin blog.csdn.net/weixin_41663412/article/details/104892981
Recomendado
Clasificación