preguntas de la entrevista de Java (JVM) - 3

estructuras de memoria de JVM.


JVM estructura principal: montón, pila, área de método, el contador de programa, de forma permanente generación) (JDK 8 espacio miembros usando alternativa).
la pila de memoria se divide en la generación joven y la vieja generación.
La joven generación se compone de tres partes, Edén, De sobreviviente y sobreviviente, la proporción de asignación de tres por defecto es de 8: 1: 1.
El método de la zona de datos almacena principalmente información de clase, una constante, las variables estáticas y similares.
Pila se divide en pila Java Virtual Machine y las pilas de métodos nativos, cada uno correspondiente a un crear un hilo de Java pila,
cada llamada a un método crea una presión marco de pila y que se ponga a la gente a pila, marcos de pila se utilizan para almacenar datos y métodos parte del proceso los resultados de la estructura de datos,
cada llamada de método a partir de los resultados devueltos con el procedimiento final, a corresponde marco de pila con el proceso de la pila a la pila.
montones de métodos nativos se utiliza principalmente para llamar a métodos nativos.
Contador de programa (Programa de Registro Contador) es la JVM una región de memoria más pequeña, la dirección de memoria tiene una máquina virtual de código de bytes instrucciones del hilo de ejecución actual.
Todos los hilos comparten el área de datos de la memoria: Método de Distrito, montón. La pila de la máquina virtual, pilas de métodos nativos y los contadores del programa son privadas hilo.


método de los procesos de trabajo, los métodos, las pilas de métodos nativos y la pila JVM pila Cuál es la diferencia.


Cada hilo tiene su propia pila, la pila contiene el marco de pila para cada método de ejecución.
La pila es una pasada en la estructura de datos primero en salir (LIFO), el método lleva a cabo actualmente en la parte superior de la pila.
Cada vez que se llama al método, se crea un nuevo marco de pila y se guarda en la pila a la parte superior de la pila.
Cuando el método devuelve o se produce una excepción no detectada, aparecerá el marco de pila.
Además de empuje y marco de pila de la pila, la pila no se puede utilizar directamente.
marco de la pila puede ser asignada en el montón, y no requiere de memoria contigua.


pila y montón de referencias a objetos JVM cómo asociados.


Después de que el montón producen una matriz o un objeto, también se puede definir una variable especial pila,
de modo que el valor de esta matriz de pila variable o objeto es igual a la primera dirección en la memoria de pila, variable de pila se convirtió en una matriz o de referencia objeto variables.
Un montón de Java es el área de datos en tiempo de ejecución, el espacio de la clase (de dispensación deseada.
Estos objetos mediante la creación de nuevos, newArray, anewarray multianewarray y otras instrucciones, código de programa, que no tienen que liberar de forma explícita.
recolección de basura del montón es responsable de la el montón es la ventaja del tamaño de la memoria asignada dinámicamente, la supervivencia no tiene que decirle al compilador de antemano,
ya que la asignación dinámica de memoria, recolector de basura de Java toma automáticamente estos datos de distancia ya no se utiliza en tiempo de ejecución.
sin embargo, la desventaja es que, debido a la asignación más lento dinámico de la velocidad de acceso a memoria en tiempo de ejecución. 

Pila ventaja es que la velocidad de acceso es más rápido que el reactor, después del registro, los datos pueden ser compartidos pila.
Pero la desventaja es que no hay datos en el tamaño de la pila y la supervivencia deben ser determinados, la falta de flexibilidad.
La tienda principal pila algunos tipos básicos de variables (int, corto, largo, byte, float, double, boolean, char) , y el controlador de objetos. 

https://www.cnblogs.com/langren1992/p/4738391.html
https://www.jianshu.com/p/ac162726d7de

Usted puede descubrir las técnicas de análisis de escape.


Método de escape: Cuando un objeto se define en el método, ya que el método puede ser referenciado externamente, tal como para ser pasado como los otros métodos en los parámetros de llamada.
Tema de escape: Cuando un objeto se define en el método, se puede acceder a las roscas externas, por ejemplo, para las variables de clase o variables de instancia accedido en los otros hilos.
Asignado en la pila: el objeto es escapar que no ocurrió, el espacio asignado en la pila. (Espacio general de asignación de objetos en el montón)
se está produciendo basa en el objetivo de escapar JVM, asignado a un diferente (montón o pila) espacio de memoria. Si uno pasa a escapar, que se asignaría al montón.

https://blog.csdn.net/qq_32575047/article/details/81214178
https://blog.csdn.net/somnusrush/article/details/76027122
https://www.jianshu.com/p/3ecc626ce304


algoritmo común de GC, CMS y el proceso de recogida de basura G1, las diversas etapas de la CMS cuál de los dos es el Pare el mundo, el CMS no producirá los residuos, la ventaja G1.
Varios algoritmos diferencia se refleja en la recuperación de la vieja generación.

PS
Mark-Copy (STP)
La joven generación de basura algoritmo
marcas - Copiar para copiar el área de Eden y el área S Survior a otra zona, y el número de marcas de supervivencia.

CMS (barrido marca actual)
generación de algoritmo antiguo de basura
marca inicial (STP): primera marca, a partir del nodo raíz, encontrar el primer nodo para detener
la marca concurrente (no STP): marca concurrente, a partir de la marca inicial del nodo etiquetado nodo no vacío
concurrente-limpieza previa (no stp): proceso de pre-limpieza.
observación (STP): Dado que la marca no es concurrente STP, no del todo hasta marcar todos los objetos que tenga que remarcar un
barrido simultáneo (no STP): no etiquetados limpiar
concurrente-reset (no STP): restablecer los datos internos estructura
cms producirán fragmentación de la memoria.
CMS se basa en la "marca - barrido" algoritmo de colector, una gran cantidad de fragmentación de la memoria, esto significa que se completó la recolección de basura,
cuando un objeto grande no es suficiente espacio contiguo para asignar, tiene que desencadenar un GC completo por adelantado, el aumento STP tiempo.

G1
basura primer algoritmo:
Inicial Marcos (STP): cms y la misma operación es a la vez gc menor.
escaneo zona de la base (STP): Referencias para sobrevivir a la zona de exploración inicial marcado en la vejez, y marcar los objetos referenciados. (Operación menor gc común)
concurrente Marcos (no stp): marca concurrente, desde el nodo de arranque inicial marca etiquetado nodo no nulo,
el cálculo de la tasa de supervivencia para cada región diana para facilitar el uso de hasta limpio etapas posteriores
observación (STP): Desde marca concurrente no es STP, no del todo hasta marcar todos los objetos tienen que re-marca de la
limpieza (no STP): Claro vaciar Región (no sobrevivió objeto), añadido a la lista libre. El reciclaje de la región simplemente no objeto, no es necesario STP.
cms y la diferencia entre g1:
g1 organización cambiado memoria, espacio de memoria no es continua,
sino una región (en E (Eden), S (superviviente ), O (viejo), H (Humongous)).
observación algoritmo de marcador de fase luego cambió, algoritmo g1 es SATB (snapshot-en-el- principio).
jdk 11 G1 como el recolector de basura por defecto.
Ventajas:
G1 es un proceso de consolidación de la memoria recolector de basura, no produce una gran cantidad de fragmentación de memoria.
G1 de Stop The World (STW) más controlable, G1 añade mecanismo de predicción sobre el tiempo de permanencia, el usuario puede especificar un tiempo de permanencia deseado.

https://tech.meituan.com/g1.html


Comprensión clara de las ventajas y desventajas marcas y etiquetas para organizar algoritmo.

Marcos - algoritmo de barrido (Mark-Sweep)
  "marca - barrido" algoritmo, como su nombre indica, el algoritmo se divide en "marca" y "claro" en dos etapas:
la primera marca de todos los objetos tienen que ser recuperado, después de marcar la finalización de la unidad todos los objetos se recuperan de la marca.
La razón por la que es el algoritmo más básica de captura, ya que los algoritmos de cobro posteriores se basan en esta idea y hacer mejoras en sus deficiencias obtenidos.
Tiene dos desventajas principales:
(1) Eficiencia: Eficiencia marcado y proceso de eliminación no es alta;
(2) el problema de espacio: producirá grandes cantidades de fragmentación de memoria marca discontinua después de desechos espaciales de compensación podría causar demasiado,
el exceso puede causar los desechos grandes no pueden asignar suficiente memoria contigua, que tenía a GC gatillo con antelación, incluso detener el mundo.
Marcos - acabado (Mark-compacto)
   copiando algoritmo de recolección llevará a cabo más operaciones de copia en una mayor supervivencia objetivo, la eficiencia será baja.
Más al punto, si no quiere perder el 50% del espacio, es necesario tener espacio asignado garantía adicional,
en respuesta a la memoria utilizada por todos los objetos son 100% de supervivencia en casos extremos, es el viejo general no puede elegir directamente este algoritmo.    
De acuerdo con las características de la vejez, se sugirió que otro tipo de "marca - acabado" algoritmo (Mark-compacto),
el proceso de etiquetado sigue siendo la "marca - barrido" algoritmo de la misma, pero los pasos posteriores no se reciclan directamente los objetos a limpiar,
pero dejar que todos los objetos que sobreviven se mueven a la final, y luego limpiar la memoria directamente fuera del límite del terminal.

https://blog.csdn.net/wuzhiwei549/article/details/80563134

La proporción de Eden District sobreviviente, ¿por qué es esta relación, el proceso de trabajo del Edén sobreviviente.

La relación predeterminada es de 8: 1: 1.
Debido a que los objetos generación de jóvenes son básicamente noche cruda hacia la muerte (80%), por lo que el algoritmo de generación joven de recogida de basura usando el algoritmo de copia.
la generación de jóvenes eden nacido en la zona, junto con un GC, copie el distrito de Edén, para que el distrito De sobreviviente, 1 edad.
Una vez más recuperado, copiar y el Eden Desde la zona sobreviviente sobreviviente a la zona. Sobre la edad de 8 años de edad, en la vieja generación.

https://www.jianshu.com/p/534ab3c8335f
 

¿Cómo la JVM para determinar si un objeto es GC, que se puede ver ya que hay varios tipos de raíz.

raíces GC. Si la ruta no alcanza el objeto raíz de un objeto, o desde el objeto raíz no puede ser una referencia al objeto que es inalcanzable.
GC: raíces
    objeto 1. Virtual Machine (JVM) hace referencia a la pila 
        durante la ejecución de cada método, la JVM crea un marco de pila correspondiente (incluyendo el marco de pila pila de operandos, tabla de variables locales, las citas a menudo corren piscina),
        marco de pila que incluye todos los objetos utilizados en el método de referencia (por supuesto, hay otros tipos de base de datos), cuando la aplicación de este último método, el marco de pila se extrae de la máquina de pila virtual
    propiedades estáticas de clase 2. el método de la zona de referencia de objeto
    objetos referenciados 3. el método de región constante (valor constante final)
    4. un método nativo pilas objeto de referencia JNI

https://blog.csdn.net/u012941811/article/details/52427372

La diferencia entre las operaciones fuertes y débiles de referencia GC fantasma de lo que realizan.

Cita fuerte:
recolector de basura nunca recuperarlo
cuando no hay suficiente espacio de memoria, Java Virtual Machine prefiere tirar OutOfMemoryError errores, terminación anormal del programa, no se recuperará por objetos al azar que tienen fuertes referencias a resolver el problema de la memoria insuficiente.
Cita suave:
Si el espacio de memoria es insuficiente, será recuperar la memoria de estos objetos
se puede utilizar para implementar cachés de memoria sensible. Si el objeto de referencia suave hace referencia es basura, la máquina virtual Java se añadirá a esta suaves referencias citadas cola asociada.
referencias débiles:
ciclo de vida más corto, sin tener en cuenta el espacio de memoria actual es suficiente o no, va a recuperar su memoria.
Si el objeto de referencia suave hace referencia es basura, la máquina virtual Java se añadirá a esta suaves referencias citadas cola asociada.
Falso cita:
objeto de referencia fantasma no determina el ciclo de vida, es probable que sea basura recogida en cualquier momento.
Y la referencia debe hacer referencia a las colas virtuales (la ReferenceQueue) que se utilizan en combinación.

https://blog.csdn.net/panyongcsd/article/details/46605613

Ya sea Java puede ser directamente la memoria de GC.

El tampón NIO proporciona una memoria JVM puede ser utilizado sin acceso directo físico clase sistema de memoria --DirectBuffer.
 hereda de la clase DirectBuffer de ByteBuffer, diferente ByteBuffer pero, ordinaria ByteBuffer todavía memoria ordinaria JVM asignado en el montón,
 su memoria máxima está limitada por la memoria máxima montón; y DirectBuffer asignan directamente en la memoria física, no ocupa espacio de montón, su usted puede aplicar para la memoria máxima limitada por el sistema operativo.
(Nota: en realidad no DirectBuffer a OS Asigna memoria de aplicación, que es en última instancia, a la memoria asignada por AllocateMemory llamando no segura de (), pero JVM en el tamaño de la memoria directa podrán aplicar también limitado, disponible -XX :. MaxDirectMemorySize = configuración 1M, recolección de basura JVM no es parte de la gestión de memoria.)
en comparación con la asignación de memoria de almacenamiento dinámico de JVM (asignar), mejor asignación de memoria directa (allocateDirect) el rendimiento de acceso, pero la distribución más lento.

https://www.cnblogs.com/z-sm/p/6235157.html?utm_source=itdadao&utm_medium=referral
http://www.importnew.com/21998.html

Java proceso de carga de clases.

Cargando enlace (validación, preparación, analítica), la inicialización.
Carga: los archivos de código de bytes de clases a partir de diversas fuentes de cargador de clases cargadas en memoria.
    fuente de código de bytes. carga general generada a partir de fuentes, incluyendo archivos compilados bajo la ruta local .class de paquete frasco de archivo .class, desde una red remota, compilador en tiempo real y proxy dinámico
    cargador de clases. cargador de clases generalmente incluyen promotor, el cargador de clases de extensión, las aplicaciones de cargador de clases, y cargador de clase de usuario personalizada.
Verificación: principalmente para asegurar el flujo entrante de bytes cargados en línea con la máquina virtual especificación, no planteará un error de seguridad.    
Preparación: El principal es asignar memoria para las variables de clase (nota, no variables de instancia), y dado el valor inicial. Java Virtual Machine es un valor inicial, dependiendo del tipo de defecto variable.
Análisis: La piscina constante de referencias simbólicas al proceso de sustitución de las referencias directas.
    referencias a los símbolos. Es decir, una cadena, pero la cadena se puede dar el número único de identificación de un método, una variable, una clase de información relacionada.
    referencia directa. Se puede entender como una dirección de memoria, o un desplazamiento. Tal como método de clases, una referencia directa a una clase variable es un puntero a la zona de método;
    referencia directa a un método de instancia, las variables de instancia es un ejemplo del puntero de cabeza desde el comienzo de la posición variable de instancia desplazamiento
de inicialización: clase principal inicialización de variables, el proceso se realiza en el constructor de la clase. La modificación de la declaración de inicialización estática o variable.

https://blog.csdn.net/ln152315/article/details/79223441
https://www.cnblogs.com/xiaoxian1369/p/5498817.html

 

Los padres modelo de proceso de delegación y las ventajas.

códigos implementados Parent modelo de delegación se concentran en el java.lang.ClassLoader loadClass () método:  
primero comprueba si se debe solicitar la clase ya se ha cargado a través de la carga;  
si no cargado sobre-:  
llamada recursiva loadClass cargador de clases padre () ;  
los padres cargador de clases está vacía después de su uso para comenzar las clases cargadas;  
si el cargador de clases padre y el cargador de clases no puede iniciar la solicitud de carga, la carga de la función de llamadas en sí.
Ventaja,
las clases de Java, junto con su clase cargador tiene una relación jerárquica con una prioridad para asegurar que el orden de carga en diversos entornos de carga.  
Para garantizar la seguridad de la operación, para evitar que la clase no es de confianza jugó una clase de confianza.

https://blog.csdn.net/inspiredbh/article/details/74889654
https://blog.csdn.net/qq_38182963/article/details/78660779

 

parámetros de ajuste convencional JVM.


traza traza:
Información Breve 1. Imprimir el GC:
-verbose: GC
-XX: + PrintGC
2. Imprimir detalles GC :( producción no utilizan)
-XX: + PrintGCDetails
3. Especifique la ubicación del registro de GC:
-Xloggc: registro / gc.log
información loader 4. clase:
-XX: + TraceClassLoading
5. la memoria de pila se proporciona:
-Xms1g -Xmx1g
6. el camino derivado OOM:
-XX: D = HeapDumpPath: /a.dump
7. el tamaño del montón inicial
-Xms
. 8 El tamaño máximo del montón
-Xmx


El análisis del archivo de volcado.


jmap -dump: file = nombre del archivo .dump [pid]
JDK viene VisualVM


Java no tiene forma activa GC gatillo (no).


System.gc ();
// o por debajo, tanto del equivalente
gc Runtime.getRuntime () () ;.
Sólo aviso GC, y no se realiza.


Las diferencias y conexiones entre las pérdidas de memoria y de desbordamiento de memoria

Recurrente pérdida de memoria:
pérdida de memoria de código para llevar a cabo varias veces, cada vez que se ejecutará dará lugar a una pérdida de memoria.
pérdida de memoria de vez en cuando:
pérdida de memoria Código se produce sólo bajo se producirá cierta operación del medio ambiente o proceso. Recurrente esporádica y se oponen.
Para un ambiente particular, esporádica tal vez se convierte a menudo de. Por lo que el entorno de prueba y métodos de ensayo para detectar pérdidas de memoria es esencial.
De una sola vez pérdida de memoria: pérdida de memoria A ocurre en el código sólo se ejecutará una vez, o debido a defectos en el algoritmo, siempre habrá una causa justa y una pérdida de memoria.
Por ejemplo, asignado en la memoria de la clase constructor, pero no dio a conocer el destructor de memoria, por lo que la pérdida de memoria se produce sólo una vez.
pérdida de la memoria implícita: no parar Asigna memoria de programa durante el funcionamiento, pero sólo hasta el final de la memoria libre.
En sentido estricto, una pérdida de memoria no sucedió aquí, debido a que la liberación de la memoria del programa final de todas las aplicaciones.
No oportuna liberación de memoria también puede conducir finalmente se quedará fuera de los sistemas de memoria. Por lo tanto, llamamos a este tipo de pérdidas de memoria pérdidas de memoria implícita.
Memoria causas y soluciones de desbordamiento:

Fuera de la razón de la memoria: 
la cantidad de datos cargados en la memoria es demasiado grande, tal como un tiempo excesivo tomado de la base de datos; 
clase de colección tiene una referencia a un objeto, no vaciada después de su uso, no se pueden reciclar de manera que JVM; 
ciclo o ciclos muerto presente generación de código demasiados entidad objeto duplicado; 
software de terceros utilizado en el ERROR; 
demasiado pequeños valores de los parámetros de inicio conjunto de memoria
de desbordamiento de memoria: 
modificar los parámetros de JVM arranque, aumentar directamente la memoria. (-Xms, parámetros -Xmx no hay que olvidar que añadir.)
Compruebe el registro de error, consulte "OutOfMemory" si hay otras anomalías o errores antes del error.
El código tutoriales y análisis para identificar las áreas potenciales de desbordamiento de memoria.


https://blog.csdn.net/ruiruihahaha/article/details/70270574

Publicados 115 artículos originales · ganado elogios 58 · Vistas de 230.000 +

Supongo que te gusta

Origin blog.csdn.net/Angry_Mills/article/details/82107305
Recomendado
Clasificación