¿Qué es un recolector de basura de Java?
El recolector de basura Java es uno de los tres módulos importantes de la máquina virtual de Java (JVM) (los otros dos son intérpretes y mecanismos de múltiples subprocesos). Proporciona aplicaciones con funciones de asignación de memoria automática (asignación de memoria) y recolección de memoria automática (recolección de basura). Ambas operaciones ocurren en el montón de Java (un trozo de memoria es rápido). En cierto punto en el tiempo, si un objeto tiene más de una referencia que le apunta, entonces el objeto está en vivo. De lo contrario, se considerará basura y puede ser reciclado y reutilizado por el recolector de basura. Las operaciones de recolección de basura requieren CPU, hilos, tiempo y otros recursos, por lo que es fácil entender que las operaciones de recolección de basura no ocurren en tiempo real (el objeto se libera inmediatamente después de la muerte). Cuando se consume la memoria o se alcanza un cierto indicador (umbral, se usa la relación de memoria a la memoria total, como 0.75), se activa la operación de recolección de basura. Hay una excepción a la muerte de un objeto. Incluso si no se hace referencia a un objeto de tipo java.lang.thread, siempre que el hilo aún se esté ejecutando, no se reciclará.
Mecanismo de reciclaje
Según el análisis estadístico, la mayoría de los objetos en Java (incluidos otros idiomas de alto nivel) tienen ciclos de vida cortos, por lo que la memoria de Java se gestiona en generaciones. El propósito de la división generacional no es más que utilizar diferentes estrategias de gestión (algoritmos) para bloques de memoria de diferentes generaciones para maximizar el rendimiento. En comparación con la generación anterior, la generación más joven suele ser mucho más pequeña, y la frecuencia de reciclaje es alta y la velocidad es rápida. Los ancianos tienen baja frecuencia de reciclaje y tardan mucho tiempo. La memoria se distribuye en la generación joven. Los objetos en la generación joven se promocionarán automáticamente a la generación anterior después de múltiples ciclos de reciclaje.
Opciones de diseño
La selección de diseño afecta la dificultad de implementación del recolector de basura JVM y los indicadores de rendimiento JVM, y es adecuado para diferentes escenarios. Describe las características de estilo del algoritmo de reciclaje.
Reciclaje en serie de un solo subproceso versus reciclaje paralelo de múltiples subprocesos
La cuestión de si la operación de reciclaje en sí misma es procesada por múltiples hilos. Las ventajas del reciclaje de un solo hilo son que es simple, fácil de implementar, con pocos fragmentos, y es adecuado para máquinas de un solo núcleo. El reciclaje paralelo multiproceso puede utilizar completamente los recursos de la CPU en máquinas múltiples, reducir el tiempo de reciclaje y aumentar la productividad. La desventaja es que es complejo y algunos fragmentos pueden no ser reciclados.
PAUSE APLICACIÓN DE APLICACIÓN Durante el reciclaje versus reciclaje y aplicación concurrente
Emitir si se detiene el hilo de la aplicación durante la operación de reciclaje. Las ventajas de la pausa de los hilos de aplicación son que son simples, precisas, limpios relativamente limpios y limpiados por un corto tiempo (excluyendo los recursos de la CPU). La desventaja es que los hilos de aplicación de pausa harán que el tiempo de respuesta de la aplicación se extienda durante el ciclo de recolección de basura, y los sistemas con un rendimiento en tiempo real muy alto son más sensibles. Las ventajas del procesamiento paralelo del reciclaje y los hilos de aplicación son que el tiempo de reacción de la aplicación es relativamente estable, y las desventajas son que es difícil lograr, alta frecuencia de limpieza y posible fragmentación.
Fragmentos de memoria liberados de manera inmergente vs fusionar fragmentos de memoria liberada vs copiar el vivo a un nuevo lugar
Estas tres opciones describen cómo administrar fragmentos de bloques de memoria muertos. Los fragmentos de memoria muerta generalmente están dispersos por todas partes en el montón. Si no se manejan, habrá dos problemas. Cuando la asignación de memoria es lenta debido a la búsqueda de memoria disponible, los fragmentos pequeños conducirán a los desechos de la memoria (como las matrices grandes requieren grandes fragmentos de memoria continua). Hay dos formas de administrar: mover la memoria viva a un extremo del bloque de memoria, registrar la posición inicial de la memoria disponible o simplemente copiar la memoria viva a una nueva área de memoria, y el bloque de memoria original está completamente vacío.
Métricas de rendimiento
①. Productividad (rendimiento)
La relación entre el tiempo de no recuperación hasta el tiempo total en un período más largo (solo los períodos largos son significativos). Medición de la eficiencia operativa del sistema.
②. Sobre la colección de basura por encima
La relación entre el tiempo de recuperación hasta el tiempo total durante un período más largo. Correspondiente a la productividad, la suma totaliza al 100%.
③. Tiempo de pausa
Cuando las máquinas virtuales Java reciclan basura, algunos algoritmos pausarán la ejecución de todos los hilos de aplicación, y algunos sistemas pueden ser sensibles al intervalo de tiempo de pausa.
④. Frecuencia de recolección
¿Cuánto tiempo se tarda en recuperarse?
⑤. El tamaño del uso de la memoria (huella)
Como el tamaño del montón.
⑥. En tiempo real (rapidez)
¿Cuánto tiempo tarda un objeto en ocupar la memoria del objeto para ser reciclado?
Tipos de recolección de basura
Todos los tipos de recicladores se basan en tecnología generacional. La máquina virtual Java Hotspot incluye tres generaciones, la generación joven, la antigua generación y la generación permanente.
① Generación Permanente
Almacena clases, métodos e información de descripción. El tamaño inicial y el valor máximo se pueden especificar mediante las dos opciones opcionales -xx: permSize = 64m y -xx: maxPermsize = 128m. Por lo general, no necesitamos ajustar este parámetro, el tamaño de generación permanente predeterminado es suficiente, pero si hay demasiadas clases cargadas y no suficientes, simplemente ajuste el valor máximo.
② Generación anterior
Los principales objetos de almacenamiento en la generación joven que aún sobreviven y actualizan después de múltiples ciclos de reciclaje aún están vivos. Por supuesto, para algunas asignaciones de memoria grandes, también pueden asignarse directamente a la generación permanente (un ejemplo extremo es que la generación joven no puede ahorrar en absoluto).
③ Generación de suyung
La mayoría de las acciones de asignación de memoria y reciclaje ocurren en generaciones más jóvenes. Como se muestra en la figura a continuación, la generación joven se divide en tres áreas, el área original (Eden) y dos pequeñas áreas de supervivencia (sobrevivientes). Las dos áreas de supervivencia se dividen de y en sus funciones. La mayoría de los objetos se asignan en el área original, y más de una operación de recolección de basura aún sobrevive en la sala de estar.
Coleccionista en serie
Un solo hilo realiza una operación de reciclaje, suspende la ejecución de todos los subprocesos de aplicación durante el período de reciclaje. El reciclador predeterminado en modo cliente se ve obligado a especificar a través de la opción de línea de comandos -xx:+USEATERIALGC.
① colección de minor para generaciones jóvenes
Mueva los objetos sobrevivientes en el área del Edén al área. Si el área a no se puede instalar, muévase directamente a la generación anterior. Si no se puede instalar el área desde el área, muévase directamente a la generación anterior. Si el área es muy antigua, actualice a la antigua generación. Después de completar el reciclaje, tanto el Edén como de las áreas están vacíos. En este momento, las funciones de y se intercambian, se cambian desde y a y a están vacías antes de cada ronda de reciclaje. La selección de diseño es replicación.
② El algoritmo de reciclaje para los ancianos (colección completa)
El reciclaje de los ancianos se divide en tres pasos: marcar, barrer y fusionar. El escenario de marcado marca todos los objetos sobrevivientes, la etapa de compensación libera todos los objetos muertos y la etapa de fusión fusiona todos los objetos sobrevivientes en la parte anterior de la antigua generación, dejando atrás todos los fragmentos libres. La selección de diseño se fusiona para reducir la fragmentación de la memoria.
Coleccionista paralelo
Use múltiples hilos para realizar la recolección de basura al mismo tiempo. El entorno múltiple puede utilizar completamente los recursos de la CPU, reducir el tiempo de reciclaje, aumentar la productividad JVM y el reciclador predeterminado en modo servidor. Al igual que el reciclador en serie, la ejecución de todos los hilos de aplicación se suspende durante el reciclaje. Forzado a especificar a través de la opción de línea de comando -xx:+UseParallElLGC.
① colección de minor para generaciones jóvenes
Se utilizan múltiples hilos para reciclar basura, y el algoritmo de cada hilo es el mismo que el de un reciclador en serie.
② El algoritmo de reciclaje para los ancianos (colección completa)
La generación anterior sigue siendo un solo hilo, lo mismo que el reciclador en serie.
Colección de compactación paralela
El reciclaje de la generación más joven y la generación anterior se procesa por múltiples subprocesos. Especificado por la opción de comando -xx:+UseParallElLOLDGC, xx: parallelgcthreads = 3 puede especificar aún más el número de hilos que participan en el reciclaje paralelo. Al igual que el reciclador en serie, la ejecución de todos los hilos de aplicación se suspende durante el reciclaje. En comparación con los recicladores paralelos, la generación anterior tiene un tiempo de reciclaje más corto, reduciendo así el tiempo de pausa. Forzado a especificar a través de la opción de línea de comando XX:+UseParallElLOLDGC.
① colección de minor para generaciones jóvenes
Igual que el coleccionista paralelo
② El algoritmo de reciclaje para los ancianos (colección completa)
Los ancianos se dividen en tres pasos: marcado, conteo y fusión. La idea de la división se usa aquí, y la antigua generación se divide en muchas regiones de tamaño fijo. En la etapa de marcado, todos los objetos sobrevivientes se dividen en n grupos (el número de hilos reciclados debe ser el mismo que el número de hilos reciclados). Cada hilo es independientemente responsable de su propio grupo, que marca la ubicación de los objetos sobrevivientes y la información de la tasa de supervivencia de la región (región) y la marca como paralela. En la etapa estadística, se cuenta la tasa de supervivencia de cada región. En principio, la tasa de supervivencia en el frente es relativamente alta. De adelante hacia atrás, se encuentra la posición inicial que vale la pena fusionarse (las áreas donde la mayoría de los objetos sobreviven no vale la pena fusionarse). La etapa estadística es serial (hilo único). En la etapa de fusión, basada en la información en la etapa estadística, múltiples hilos copian los objetos sobrevivientes de una región a otra región en paralelo.
Coleccionista concurrente de Mark-Sweep
También conocido como el coleccionista de baja latencia, la aplicación se suspende por un tiempo más corto a través de varios medios. Básicamente realiza operaciones de reciclaje simultáneamente con la aplicación, sin fusionar y copiar operaciones. Especificado a través de la línea de comandos -xx:+useconcmarksweepGC, también puede especificar el uso del modo de reciclaje incremental -xx:+useconcmarksweepgc en sistemas de un solo núcleo o dual de doble núcleo. El reciclaje incremental se refiere a dividir la operación de reciclaje en múltiples fragmentos, ejecutar un fragmento y liberar recursos de CPU a la aplicación, y luego continuar reciclando el último resultado en un cierto punto en el futuro. El propósito también es reducir el retraso.
① colección de minor para generaciones jóvenes
Igual que el coleccionista paralelo
② El algoritmo de reciclaje para los ancianos (colección completa)
Se divide en cuatro pasos: marca inicial, marca concurrente, observación y barrido concurrente. Preste especial atención, no hay operación de fusión, por lo que habrá fragmentos.
Herramienta de evaluación del rendimiento para Java Bassbage Collector
①xx:+printgcdetails y xx:+printgctimestamps
Información sobre la hora de inicio, la duración, la memoria de libra de cada generación, etc.
②jmap [opciones] pid
JAMP 2043 Ver objetos compartidos que se han cargado en el proceso 2043. Generalmente archivos DLL.
JMAP -HEAP 2043 Verifique la información de configuración y el uso del montón de memoria.
JMAP -PMSTAT 2043 Verifique el estado de carga de la generación permanente.
JMAP -HISTO 2043 Verifique el uso de carga y memoria de la clase.
③jstat [Opciones] PID
JSTAT -Class 2043 Carga, descarga, uso de memoria.
JSTAT -GC 2043 Estado de ejecución GC.
posdata
Java proporciona funciones automáticas de selección y optimización automática de rendimiento. Antes de hacer un ajuste del recolector de basura, primero enumere los indicadores de rendimiento que le preocupa, dígale al JVM los indicadores de rendimiento que le preocupa a través de la línea de comando y ajustados automáticamente por el JVM. Si no está satisfecho, puede especificar el recolector de basura. OutOfMemory generalmente se debe a la memoria de montón insuficiente, por lo que puede ajustar las líneas de comando -xmx1024m y -xx: maxPermsize = 128m.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.