Este artículo lo lleva a comprender la administración de memoria de la máquina virtual jvm

Área de datos de tiempo de ejecución

  • Contador de programa (hilo privado)
    • Un pequeño espacio de memoria puede considerarse como un indicador de número de línea del código de bytes ejecutado por el hilo actual. Si el hilo está ejecutando un método java, se registra la dirección de la instrucción de código de bytes de la máquina virtual que se está ejecutando; si se ejecuta el método nativo, el valor del contador está vacío. Nota: Esta área de memoria es la única que no especifica ningún OutOfMemoryError en la especificación de la máquina virtual de Java
  • pila de máquina virtual java (hilo privado)
    • La pila de la máquina virtual describe el modelo de memoria de la ejecución del método java: cada método creará un marco de pila (marco almacenado) utilizado para almacenar la tabla de variables locales, la pila de operandos, el enlace dinámico, la salida del método y otra información durante la ejecución.
    • La tabla de variables locales almacena varios tipos de datos básicos, referencias de objetos y tipos de returnAddress (apuntando a la dirección de una instrucción de bytecode) que se conocen en el momento de la compilación. Nota: Entre ellos, los datos de tipo doble y largo de 64 bits ocuparán 2 variables locales Espacio (ranura), los datos restantes solo ocupan uno.
    • Dos excepciones en el área de la pila: excepciones StackOverflowError y OutOfMemoryError
  • Pila de método local (hilo privado)
    • La pila de métodos locales es el servicio de métodos nativos utilizado por la máquina virtual.
  • montón de java
    • El montón es la mayor parte de la memoria administrada por la máquina virtual, y el montón de Java es un área de memoria compartida por todos los subprocesos, creada cuando se inicia la máquina virtual
    • Desglose del montón de Java: nueva generación y generación anterior. Tenga más cuidado con el espacio Eden, desde el espacio sobreviviente, hasta el espacio sobreviviente, etc. Desde la perspectiva de la asignación de memoria, los buffers de asignación privada de subprocesos múltiples (Thread Local Allocation Buffer, TLAB) se pueden dividir en el montón de Java compartido por subprocesos
    • -Xmx y -Xms establecen si la memoria del montón de máquina virtual se puede expandir
  • Área de método (alias no heap no heap)
    • Se utiliza para almacenar tablas de datos como información de clase, constantes, variables estáticas y código compilado por el compilador a tiempo por la máquina virtual.
    • El grupo constante de tiempo de ejecución es parte del área de método. Además de la versión de la clase, los campos, los métodos, las interfaces y otra información descriptiva en el archivo de la clase, también hay un grupo constante, que se utiliza para almacenar varios literales y referencias de símbolos generados por el compilador. Esta parte se ingresará después de cargar la clase. Almacenado en el grupo constante de tiempo de ejecución del área de método.
  • Memoria directa
    • En jdk1.4, se agregó la nueva clase nio y se introdujo un método de E / S basado en canales y buffers. Puede usar la biblioteca de funciones nativas para asignar directamente la memoria fuera del montón y luego usar un objeto directByteBuffer almacenado en el montón de Java como esto Bloquee la operación de referencia de memoria. Esto puede mejorar significativamente el rendimiento en algunos escenarios porque evita copiar datos de un lado a otro entre el montón de Java y el montón nativo.
    • La asignación de memoria directa local no está limitada por el tamaño de almacenamiento dinámico de Java, pero si ignora la memoria directa cuando configura información de parámetros como -Xmx, la memoria total puede ser mayor que el límite de memoria física, lo que resulta en una excepción OutOfMemoryError durante la expansión dinámica.

Varios OutOfMemoryError comunes

  • desbordamiento de montón de Java
    • java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java
    • Cuando se produce un desbordamiento del montón, el método general es analizar la instantánea del volcado del volcado a través de una herramienta de análisis de imágenes de memoria (como el analizador de memoria eclipse). Lo primero que debe saber es si se trata de una pérdida de memoria o un desbordamiento de memoria
  • Pila de máquina virtual y desbordamiento de pila de método nativo
    • La capacidad de la pila solo se establece mediante el parámetro -Xss
    • Con respecto a la pila de máquina virtual y la pila de método local, se describen dos excepciones en la especificación de máquina virtual de Java:
      • Si la profundidad de la pila solicitada por el hilo es mayor que la profundidad máxima permitida por la máquina virtual, se lanzará StackOverflowerror
      • Si la máquina virtual no puede solicitar suficiente espacio al expandir la pila, se lanza un OutOfMemoryError
  • Área del método y desbordamiento constante del grupo de tiempo de ejecución
    • VM Args: -XX: PermSize = 10M -XX: MaxPermSize = 10M
    • java.lang.OutOfMemoryError: espacio PermGen
  • Desbordamiento de memoria directa local
    • La capacidad de DirectMemory se puede especificar mediante -XX: MaxDirectMemorySize; si no se especifica, el valor predeterminado es el mismo que el valor máximo del almacenamiento dinámico de Java
    • Una característica obvia del desbordamiento de memoria causada por directMemory es que no se verán anormalidades obvias en el archivo Heap Dump. Si el archivo de volcado es pequeño después de encontrar el OOM y el programa usa NIO directa o indirectamente, puede considerar si Problema de aspecto

Asignación de memoria y estrategia de reciclaje.

Los objetos se asignan primero en Eden

En la mayoría de los casos, los objetos se asignan en la nueva generación del Edén. Cuando no hay suficiente espacio para la asignación en el área de Eden, la máquina virtual iniciará un GC menor.

Los objetos grandes van directamente a la vieja generación.

El llamado objeto grande se refiere a objetos-java que requieren una gran cantidad de espacio de memoria continuo (los objetos grandes más típicos son esas cadenas largas y matrices). La máquina virtual proporciona un parámetro -XX: PretenureSizeThreshold, de modo que los objetos mayores que este valor de configuración se asignan directamente en la generación anterior. El propósito de esto es evitar que se copie mucha memoria entre el área de Eden y las dos áreas de sobrevivientes.

Los objetos longevos entrarán en la vejez

Los objetos nacidos en el Edén, que existen después del primer GC menor y pueden ser acomodados por el sobreviviente, se moverán al sobreviviente con la edad establecida en 1. Cada vez, la edad +1 hasta que se alcanza el umbral (por defecto 15, se puede establecer por -XX: MaxTenuringThreshold)

Juicio dinámico de edad

Si la suma del tamaño de todos los objetos de la misma edad en el espacio del sobreviviente es mayor que la mitad del espacio del sobreviviente, los objetos mayores o iguales a la edad ingresan directamente a la generación anterior sin esperar a que la edad alcance el umbral.

Algoritmo de recolección de basura

  • Algoritmo de marca-barrido
  • Algoritmo de replicación
  • Algoritmo de clasificación de marcas
  • Algoritmo de colección generacional

Herramienta de monitoreo y resolución de problemas de máquinas virtuales

herramienta de línea de comando jdk
  • jps: herramienta de estado del proceso de máquina virtual
    • Puede enumerar los procesos de la máquina virtual en ejecución y mostrar el nombre de la clase principal de ejecución de la máquina virtual (Clase principal, la clase donde se encuentra la función main ()) y la identificación única de la máquina virtual local de estos procesos (Identificador de máquina virtual local, LVMID)
    • -q: genera solo LVMID, omitiendo el nombre de la clase principal
    • -m: muestra los parámetros pasados ​​a la función main () de la clase principal cuando comienza el proceso de la máquina virtual
    • -l: muestra el nombre completo de la clase principal, si el proceso ejecuta un paquete jar, muestra la ruta del jar
    • -v: salida de parámetros jvm cuando se inicia la máquina virtual
  • jstat: herramienta de monitoreo de estadísticas de máquinas virtuales
    • JVM Statistics Monitoring Tool es una herramienta de línea de comandos que se utiliza para monitorear información diversa sobre el estado operativo de las máquinas virtuales y puede mostrar datos operativos como reimpresión de clase, memoria, recolección de basura, compilación de jit, etc. La herramienta preferida para localizar problemas de rendimiento de la máquina virtual durante el tiempo de ejecución
    • -gc: controla el montón de java, incluido el área de Eden, dos áreas de sobrevivientes, la capacidad de la generación anterior, la generación permanente, etc., el espacio utilizado, la cantidad total de tiempo gc y otra información
    • -clase: supervisa la carga de la clase, la cantidad de descarga, el espacio total y el tiempo dedicado a la carga de la clase
    • -gcutil: el contenido de supervisión es básicamente el mismo que -gc, pero la salida se centra principalmente en el porcentaje de espacio utilizado en el espacio total
  • jinfo: herramienta de información de configuración de Java
    • La función de Información de configuración para Java es ver y ajustar varios parámetros de la máquina virtual en tiempo real.
  • jmap: herramienta de mapeo de memoria java
    • El comando Mapa de memoria para Java se utiliza para generar instantáneas de volcado de montón (comúnmente conocido como heapdump o archivos de volcado).
    • -dump: generar instantánea de volcado de almacenamiento dinámico de Java
      • -dump: [live,] format = b, file = live subparameter indica si solo los objetos vivos son volcados
    • -heap: muestra información detallada sobre el montón de Java, como qué recopilador usar, configuración de parámetros, estado de generación, etc.
    • -histo: muestra estadísticas de objetos en el montón, incluida la clase, el número de instancias y la capacidad total
    • -F: cuando el proceso de la máquina virtual no responde a la opción -dump, puede usar esta opción para forzar una instantánea de volcado.
  • jhat: herramienta de análisis de instantáneas de volcado de montón de máquina virtual
    • Sun JDK proporciona el comando jhat (JVM Heap Analysis Tool) utilizado con jmap para analizar la instantánea de volcado de montón generada. Se crea un pequeño servidor HTTP / HTML en jhat. Después de generar el resultado del análisis del archivo de volcado, puede verlo en el navegador.
    • Nota: generalmente no use este comando para analizar archivos de volcado en el servidor de producción
      • Las herramientas de análisis son un proceso que consume tiempo y hardware.
      • La función de análisis de jhat es relativamente simple
  • jstack: herramienta de rastreo de pila java
    • El comando Stack Trace for Java se utiliza para generar una instantánea de subproceso de la máquina virtual en el momento actual (generalmente denominado subproceso de subproceso o archivo Javacore)
    • -l: además de la pila, muestra información adicional sobre el bloqueo
    • -m: si llama a un método local, puede mostrar la pila C / C ++
    • -F: cuando la solicitud de salida normal no se responde, fuerce la pila de subprocesos de salida
Publicado 8 artículos originales · Me gusta1 · Visitas 263

Supongo que te gusta

Origin blog.csdn.net/qq_40635011/article/details/105413114
Recomendado
Clasificación