Inicio rápido de JVM

Descripción general del sistema JVM arquitectónica

  1. JVM está en marcha, y no lo hace interactuar directamente en la parte superior del sistema operativo del hardware.
    Aquí Insertar imagen Descripción
  2. arquitectura figura JVM:
    Aquí Insertar imagen Descripción
  3. cargador de clases
    (1) El mecanismo de carga de clases: los datos de máquinas virtuales que describe las clases cargadas desde archivos .class en la memoria, y comprobar los datos, y convertidos de análisis sintáctico de inicialización, formando tipo Java se pueden utilizar como una máquina virtual.
    (2) el procedimiento de carga de clases:
    Aquí Insertar imagen Descripción
  • Cargar: Cargar el contenido de los archivos de clase de código de bytes en la memoria; y convertir el contenido en el área de método, la
    estructura de datos en tiempo de ejecución; de generación en la memoria representa java.lang.Class objeto de esta clase, como un método de datos basada en la zona entrada de acceso
  • Validación: para asegurar que el contenido de las especificaciones del byte de cumplimiento archivo de clase JVM, y no poner en peligro su seguridad JVM
    completa.
  • Preparación: asignada oficialmente como variables de clase (variables estáticas) espacio de memoria, e inicializar (el valor predeterminado se asigna una variable estática
    valor), el área de memoria en el método de variables estáticas asignados.
  • Análisis: VM piscina constante de referencias simbólicas al proceso de sustitución de las referencias directas.
    Por ejemplo cadena s = "AAA", dirigida en dirección de s "AAA" a la dirección
  • Inicialización: la terminación de la inicialización de las variables estáticas y otros recursos de conformidad con los procedimientos desarrollados por programadores planos subjetivos de. En este proceso se completará misiones y las variables estáticas declaración de bloques de código estático.
  1. cargador de clases (cargador de clases)
    cargador de clases (1.): Proceso de carga de clases para implementar la etapa de carga, responsable de cargar los archivos de clase de código de bytes en contenido de la memoria; y convertir el contenido en una estructura de datos en tiempo de ejecución en el área de método , generando en la memoria representa java.lang.Class objeto de esta clase, como un método de acceso basado en la zona de entrada de datos.
    Aquí Insertar imagen Descripción
    (2) Categoría de la carga de clase:
  • Virtual cargador de clases máquina viene con
    el cargador de clases de arranque: el lenguaje C ++, es responsable de cargar el contenido de% JAVA_HOME% / jre / lib / rt.jar la
    extensión de cargador de clases: el lenguaje Java, se encarga de cargar% JAVA_HOME% / jre / lib /ext/*.jar el contenido del
    cargador de clases de aplicaciones: también se le llama el cargador de clases del sistema, que es responsable de cargar todas las clases CLASSPATH la ruta de clase de usuario. Si la aplicación no define su propio cargador de clases tuvo, en general, utilizar el cargador de clases de aplicaciones predeterminado.
  • definido por el usuario cargador de clases, heredad el java.lang.ClassLoader
    Aquí Insertar imagen Descripción
    del modelo de delegación cargador de clases padre (padres Delegación Modelo) (3).:
  • Proceso de trabajo: Si se carga un cargador de clases recibió una solicitud, que no intentará utilizar sus propias cargas de la clase, pero a delegar esta solicitud al cargador de clases padre para completar cada nivel del cargador de clases es cierto, por lo tanto, todas las solicitudes de carga final debe ser transferido al inicio de la carga de clase más alta, sólo la retroalimentación de los padres que no pueden completar la solicitud de carga (no en su búsqueda para encontrar las categorías requeridas) cuando la subclase intentará cargarlo .
  • Beneficios: La relación entre la organización modelo padres acumulador designados, hay una ventaja obvia es que
    clase de Java, ya que se carga con una relación jerárquica de prioridad junto con, por ejemplo, carga situados
    rt.jar de java. lang.Object clase, independientemente de que las cargas de cargador de clases de la clase, con el tiempo confiada a
    la parte superior del cargador de clases de arranque de carga, por lo que el entorno de cargador de clases de objetos en diversos tipos de programas están en la misma clase.
    (4) Ejemplo de código:
public class Test{
public static void main(String[] args) throws IOException {
	Object obj = new Object();
	System.out.println(obj.getClass().getClassLoader());
	MyClass mc = new MyClass();
	System.out.println(mc.getClass().getClassLoader().
	getParent().getParent());
	System.out.println(mc.getClass().getClassLoader().getParent());
	System.out.println(mc.getClass().getClassLoader());
	}
}
class MyClass{}

modelo de delegación de los padres es importante para el buen funcionamiento de java, pero la implementación subyacente es muy simple, los padres se dieron cuenta de delegadas java.lang.ClassLoader gran conjunto de código en el método loadClass (): si el cheque ya había sido cargado, si no se ha cargado a continuación, llamar a los padres loadClass método de la clase, hasta que encuentra un cargador de clases inicio, cargador de clases de arranque realizados elementos de búsqueda dentro de su rango, si el cargador de clases padre no se carga, entonces el manejo de excepciones subclase, se llama método FindClass para la carga.

protected synchronized Class<?> loadClass(String name, boolean
resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
private Class findBootstrapClass0(String name)throws ClassNotFoundException{
	check();
	if (!checkName(name))throw new ClassNotFoundException(name);
	return findBootstrapClass(name);
}
private native Class findBootstrapClass(String name)throws ClassNotFoundException;
  1. JVM detalles de la configuración de memoria
    Aquí Insertar imagen Descripción
    Nota: La zona naranja representa los datos compartidos por todos los hilos de la zona gris representa el hilo aislado
  • Contador de Programa: Es un pequeño espacio en la memoria, que puede ser visto como un indicador de la actual número de línea de código de bytes hilo de ejecución. intérprete de código de bytes durante la operación cambiando el valor del contador es el siguiente código de bytes para seleccionar una instrucción a ser ejecutada, una rama, bucles, ramificación, manejo de excepciones, hilos y otras funciones básicas dependen de la activación de la barra para completar. Mientras tanto, con el fin de restablecer el interruptor de hilo a la posición correcta ejecución, cada hilo requiere un contador de programa separado, entre los hilos de forma independiente una de la otra tienda, independiente, llamamos a este tipo de área de memoria para el "hilo privada" memoria
  • Java pila de la máquina virtual: el contador de programa, tal como privada hilo, y el ciclo de vida del mismo hilo. Es una pila de máquina virtual de Java modelo de memoria método descrito a cabo: Cada método crea un marco de pila (StackFrame) en el desempeño de almacenamiento de información para la tabla de variables locales, operando pila, la vinculación dinámica, las exportaciones de método. Cada llamada al método hasta que se completa la ejecución, que corresponde a un marco de pila en una máquina virtual para empujar la pila de la pila durante
    Aquí Insertar imagen Descripción
  • montones de métodos nativos: Uso nativo al método de servicio de la máquina virtual, también pertenece a la zona de datos privada hilo. En circunstancias normales, no es necesario centrarse en esta área.
  • método Distrito: también conocido como no montón para máquina virtual de almacenamiento de información de la clase que se ha cargado, constantes, variables estáticas, el compilador tiempo para compilar el código y otros datos, cada hilo es un área de memoria compartida.
    Nota: una región llamada la piscina constante de tiempo de ejecución (runtime constante piscina) en la zona hay un método, que se utiliza principalmente para almacenar diversos símbolos compilados literales y las referencias a esta parte serán almacenados en la piscina constante de tiempo de ejecución del cargador de clases en.
  • montón de Java: Es la pieza más grande de memoria en la gestión de la máquina virtual de Java, y es compartida por todos los hilos en una zona de memoria creada cuando la máquina virtual está encendido, el objetivo principal es almacenar una instancia de objeto. Al mismo tiempo, esta área es el área más importante de la gestión del recolector de basura, y por lo tanto a menudo se hace referencia también como "montón GC", de acuerdo con el algoritmo de recolección de basura generacional utilizado por los coleccionistas.
    la pila de memoria lógicamente divide en:
    Aquí Insertar imagen Descripción

La recolección de basura

  1. La determinación de si los objetos muertos
    (1) algoritmo de recuento de referencias: la adición de un contador de referencia, es decir, cada vez que un lugar para referencia a este objeto, el contador se incrementa en uno para cada objeto, cuando se refiere a fallar, el contador se decrementa en 1; cualquier ya no está siendo utilizado objeto de contador 0 tiempo.
    Ventajas: fácil de poner en práctica los operadores recuento de referencias, de alta eficiencia se determina
    inconvenientes: es difícil de resolver el problema se hace circular entre la referencia de objeto.
    Nota: la corriente principal actual de la máquina virtual de Java no utiliza algoritmo de recuento de referencias a gestionar la memoria.
    (2) algoritmo de análisis de asequibilidad: Como punto de partida para buscar a través de una serie de objetos llamados "Roots GC" hacia abajo desde estos nodos, llamado búsqueda camino recorrido cadena de referencia (cadena de referencia), cuando un objeto Roots GC sin ninguna referencia a la cadena, entonces la prueba no está disponible cuando el objeto.
    Aquí Insertar imagen Descripción
    En el lenguaje Java, como un objeto de GC Las raíces pueden incluir lo siguiente:

    • pila VM (variables locales del marco de pila tabla) objetos referenciados
    • Método estático objeto de clase de la propiedad referenciada por regiones
    • El método de la región objeto de referencia constante
    • pila método nativo (nativo Method) objetos referenciados
  2. Clasificación citado
    (1) Antecedentes: La comprensión de que se hace referencia a un solo objeto o no hace referencia en los dos estados tradicionales, sino describir cómo "gesto de mal gusto" del objeto no puede permitirse. Queremos describir una clase de objetos: Cuando el espacio de memoria también es suficiente, es capaz de permanecer en la memoria, después de llevar a cabo la recolección de basura, si el espacio de memoria sigue siendo muy apretado, usted puede deshacerse de estos objetos (tampón de función muchos sistemas están en línea con dichas aplicaciones escena).
    (2) Después de JDK 1.2, la referencia al objeto se divide en cuatro niveles, de modo que el programa puede ser ciclo de control objeto vida más flexible:

    • Una referencia fuerte (Referencia Strong)
    • referencias suaves (Soft Referencia)
    • referencias débiles (referencia débil)
    • referencia virtual (Phantom Referencia)

    (3) niveles de referencia de alta a baja: Referencias strong> referencia suave> referencia débil> referencia phantom

    • Cita fuerte: es el programa usado más comúnmente en referencia a un similares "Object obj = new Object ();" mencionada referencia, siempre y cuando hay referencias fuertes, el recolector de basura nunca se recuperará a cabo referencias fuertes en el objeto, incluso cuando la memoria cuando la falta de espacio, JVM lanza OutOfMemoryError, no reciclar.
    • Cita Soft: No se usa para describir algunos, pero no con los objetos necesarios. Si un objeto tiene sólo referencias suaves, el espacio de memoria es suficiente, el recolector de basura no recupera él, y si el espacio de memoria es insuficiente, será recuperar la memoria de estos objetos. Siempre y cuando el recolector de basura no recupera, el objeto puede ser utilizado por el programa. Puede ser utilizado para implementar referencia de memoria caché y minúsculas. Después de JDK 1.2, proporciona la clase que implementa el SoftReference referencias suaves.
    • referencias débiles: se utiliza para describir los objetos que no son necesarios. referencias débiles y blandos citados diferencia es que: solamente una débil objetos de referencia tienen ciclo de vida más corto. En el proceso de escanear el hilo recolector de basura bajo su jurisdicción área de memoria, una vez que se encontraron sólo una débil objetos de referencia, sin tener en cuenta el espacio de memoria actual es suficiente o no, va a recuperar su memoria. Después de JDK 1.2, que proporciona implementación de la clase WeakReference débil.
    • Cita Virtual: Como su nombre indica, es inexistente, y varias otras referencias son diferentes de referencia, virtual y no determina el ciclo de vida del objeto. Si un objeto contiene sólo una referencia fantasma, y ​​luego no tiene ninguna referencia, es probable que sea basura recogida en cualquier momento, no se puede obtener por referencia a una instancia virtual de un objeto. El único propósito de las referencias asociadas a un entorno objeto virtual es hacer que el objeto actual recibe una notificación cuando se recoge la basura. Después de JDK 1.2, que proporciona la clase de referencia virtual PhantomReference.
  3. Las diferentes regiones de basura de recogida
    Aquí Insertar imagen Descripción
    zona métodos: es decir HotSpot VM en nombre de la recolección de basura generacional recuperación principal permanente, permanente de dos partes: una constante y objeto de la clase de residuos inútil

  • Las constantes abandonados: Suponiendo constante de cadena "abc" ha entrado en la piscina constante, pero el sistema actual no tiene ningún punto de referencia a una constante de cadena "abc", no hay otro lugar para utilizar el "abc" constante literal, si se produce la recuperación de la memoria, y también en estas circunstancias es necesario, sería constantes claras "ABC".
  • Inútil objeto de clase:
    (1) todas las instancias de la clase de los objetos han sido recuperados, es decir, no hay una verdadera pila Java clase
    Ejemplo
    (2) cargar la ClassLoader clase ha sido recuperado
    (3) correspondiente a la clase java .lang.Class objeto no se hace referencia a ninguna parte, en ningún modo
    por el método de reflexión a la clase de acceso lateral
    nota: aquí los objetos inútiles que satisfacen las tres condiciones se pueden reciclar, pero no es obligatorio. Necesidad de ser recuperado
    puede ser controlado por parámetros -Xnoclassgc;
    también permite XX: + TraceClassLoading classloading información vista.
  • Montón: especialmente en la nueva colección de la generación de basura, las aplicaciones de rutina de recolección de basura se puede recuperar por lo general el 70% y el 95% del espacio.
    La figura asignación de memoria heap:
    Aquí Insertar imagen Descripción
    Descripción: se crea zona neonatal, la aplicación, el área de troquel del objeto, un objeto generado aquí, debe ser
    utilizado, con el tiempo se recoge la basura, troquel. área de primer año se divide en dos partes: el área y sobrevivientes Eden
    región. Todos los objetos (nuevo) son de nueva creación en el área de Edén; dividido en dos sobrevivientes: Supervivientes Zona 0
    y Zona 1, cuando el área Edén de espacio se agota, el programa tendrá que crear un nuevo objeto, objetos JVM Irak área de Austin para comenzar la recolección de basura, la aplicación es YGC, el objeto ya no utilizar el área de Edén fueron destruidos, y luego el resto del objeto área de Edén, para que la zona sobrevivientes 0, 0 zona llena de basura zona de destrucción 0 sobrevivir objeto a los supervivientes de la zona 1, zona 1 si demasiado lleno, y luego mover el área a la zona de pensión 1; si el área de pensiones también está lleno, entonces la JVM se abrirá FullGC (abreviatura: FGC), llevado a cabo Limpiador de memoria área de pensiones. Pero si la implementación de Full GC aún no se puede guardar se genera el nuevo objeto de excepción OOM: desbordamiento de pila
  1. algoritmo de recolección de basura
    (1) marca - algoritmo de barrido (Mark-Sweep) : Es el algoritmo de recolección de basura más básico, otros algoritmos se basan en esta idea y mejorados. Marcos - algoritmo de barrido se divide en "marca" y "claros" dos etapas: la primera marca de los objetos tienen que ser recuperado, la marca después de la unificación de todos los objetos están marcados recuperación.
    Aquí Insertar imagen Descripción
    desventajas:
  • Mark y barrido de dos eficiencia del proceso no es alto
  • Marcador generará una gran cantidad de fragmentación de la memoria discreta después de compensación, se producirá objeto grande subsiguiente no puede ser encontrado
    con el problema de espacio disponible
    (2) el algoritmo de copia (copia) : que la memoria disponible se divide en dos, cada uno de los cuales sólo uno, y cuando esto se acabe la memoria también objetos vivos copiados a otra pieza de lo anterior, el espacio de memoria que se ha utilizado una vez y luego salga limpio.
    Aquí Insertar imagen Descripción
  • Análisis: A pesar de que este algoritmo es simple, de alta eficiencia de la memoria, difícil de residuos de productos, pero el mayor problema es que la memoria disponible se comprime a la mitad del original. Y el número de objetos vivos, entonces la eficiencia de los algoritmos de copia se reducirá considerablemente.
  • Aplicaciones: versión comercial actual del algoritmo de replicación máquina virtual usando reciclado nueva generación, la nueva generación de 98% de los objetos son "noche en bruto hacia el muerto", por lo que el espacio de memoria de pila se divide en una pieza más grande de Eden y dos Servivor menor (supervivientes) espacio, máquina virtual HotSpot y la relación de tamaño predeterminado Servivor Eden de 8: 1. Cada vez que utilice un Edén y Servivor que, una vez recuperada, la copia de una sola vez y Servivor Eden también objetos vivos a otra pieza Servivor, Eden finalmente salga limpio y el espacio utilizado Servivor
    (3) marca - Algoritmo de clasificación ( compacto-marca) : operación de marcado y el - algoritmo de "marca de barrido" como una operación de seguimiento directo no queda clara el objeto, pero cuando la limpieza se completa objetos inútiles de manera que todos los objetos activos se mueven a la final, y luego limpiar directamente a la frontera final aparte de la memoria.
    Aquí Insertar imagen Descripción
  • Análisis: sin fragmentación de la memoria, tenemos que mover objetos en la base de marcas o reducirá la eficiencia
    de.
  • Aplicaciones: vejez objetivo de la tasa de supervivencia más alta, este algoritmo colección comúnmente utilizados para el reciclaje.
    (4) algoritmo de recolección generacional (Colección generacional) : el negocio de la recolección de basura corriente máquinas virtuales se basan en la "colección generacional", su idea central se basa en el objeto viva la memoria de su ciclo de vida se divide en varias áreas diferentes. En general, cuando el área del montón en las características de la vieja año (Titular generación) y la nueva generación (generación joven), la vejez es un tiempo de sólo unos pocos objetos tienen que ser recogida de basura reciclada, y las características de la nueva generación es que cada recolección de basura vez tiene un gran número de objetos que se han recuperado, entonces podemos tomar el algoritmo de colección más adecuada en función de las características de diferentes generaciones.
  • algoritmo de GC de más de JVM para la nueva generación han tomado Copiado
  • Debido a que cada generación vieja objetos para recuperar sólo una pequeña cantidad, por lo tanto con Mark-compacto Algoritmo
Publicado 24 artículos originales · ganado elogios 1 · visitas 507

Supongo que te gusta

Origin blog.csdn.net/Mr_YXX/article/details/104936116
Recomendado
Clasificación