Una JVM

Alerta de nosotros mismos para aprender y crecer

1. preguntas de la entrevista comunes

  1. Por favor, hable acerca de su comprensión de la JVM? Java8 lo que es nueva máquina virtual,

    JVM es la base de la cruz-plataforma de Java, se ejecuta la JVM datos de zona horaria, el motor de ejecución, la interfaz de la biblioteca local, que consiste en las bibliotecas de métodos nativos

  2. ¿Cuál es el OOM, se habla de las razones OOM generan? Cómo analizar

    OOM: OutOfMemoryError, sin memoria cuando la JVM porque no hay suficiente memoria para asignar espacio para el objeto y el recolector de basura no tiene reciclables espacial, lanzará este error.

    Las causas:

    • memoria de la máquina virtual no es suficiente:
      • El tamaño actual de la huella de la memoria del servidor de aplicaciones, se puede tratar de transferir gran prueba de memoria de la máquina virtual.
    • Fuera de pérdida de memoria / memoria
      • Los parámetros pueden ser añadidos cuando el programa se está ejecutando, se genera instantánea memoria Dump para el análisis cuando hay un desbordamiento de la memoria.
  3. parámetros de ajuste de JVM en el que se utiliza

    -Xmx: establecer el máximo del montón

    -Xms: Establecer el circuito de espera mínimo

    ...

  4. instantánea de la memoria, analizar al arrastre, qué comando?

    Uso -XX: + conjunto de comandos HeapDumpOnOutOfMemoryError se genera OOM instantánea de memoria anormalidad

  5. partición dentro Heap: Eden, Survial (de a), tenured

  6. GC algoritmos de recolección de basura y que de? Para hablar de los pros y los contras

  7. Cómo determinar cuándo JVM basura recogida de basura, GCRoots

  8. -x -XX parámetros que utilizaste

  9. parámetros de ajuste JVM sido su configuración favorita del proyecto después de la liberación

  10. Referencias, referencias fuertes y débiles referencias, referencias fantasmas son los que se habla de

  11. La relación entre GC y GC algoritmo recolector de basura? ¿Cuáles son?

  12. características de colector de basura G1

  13. OOM visto varios

java -XX: + PrintCommandLineFlags -versión

C: \ Users \ tianxc> java -XX: + PrintCommandLineFlags -versión
-XX: InitialHeapSize = 266536512 -XX: MaxHeapSize = 4264584192 -XX: + PrintCommandLineFlags -XX: + UseCompressedClassPointers -XX: + UseCompressedOops -XX: -UseLargePagesIndividualAllocation -XX: + UseParallelGC
java version "1.8.0_191"
Java (TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot (TM) de 64 bits del servidor VM (build-b12 25.191, de modo mixto)

ubicación 2.JVM

arquitectura 3.JVM

Nuestro llamado sintonización está en sintonía montón

4. El cargador de clases

Cargando la clase, la conexión y la inicialización

Carga: buscar y cargar la clase de datos binarios

conexión:

  • Verificar: garantizar la exactitud de la clase cargada
  • Preparación: variables estáticas para asignar espacio de memoria para la clase, asignar un valor inicial predeterminado
  • Análisis: La clase se convierte en referencias símbolo de referencia directa

Cuando se compila a los archivos de clase Java, la máquina virtual no conoce la dirección referenciada por los mnemotécnicos: simbólica referencias! En una referencia directa a la dirección real, directo a encontrar correspondiente.

Inicialización: Las variables estáticas asignadas a la clase del valor correcto.

public class Test{
    public static int a=1;
}
//1.加载 编译文件为.class文件,通过类加载,加载到JVM

//2.连接
//验证(1) 保证class类文件没有问题
//准备(2) 给int类型分配内存空间,a=0;
//解析(3) 符号引用转换为直接引用。

//3.初始化
//经过这个阶段的解析,把1赋值给变量a

clase estática de carga

package com.ruyidd.classloader;

/**
 * @author: tianxc
 * @date: 2020-03-10 15:13
 * @desc: JVM参数:-XX:+PrintGCDetails//打印GC垃圾回收信息
 * -XX:+TraceClassLoading 打印类加载信息
 * rt.jar   jdk出厂自带的,最高级别的类加载器要加载的。
 */
public class Demo01 {

    public static void main(String[] args) {
        System.out.println(MyChild01.str2);
    }
}
class Myparent01{

    private static String str = "hello,world";
    static {
        System.out.println("Myparent01 static");
    }

}
class MyChild01 extends Myparent01{
    public static String str2 = "hello,str2";
    static {
        System.out.println("MyChild1 static");
    }
}

constantes finales en tiempo de compilación cuando se puso en una bolsa de constantes:

Esto hará que las constantes de código de la piscina constante Demo02, después Demo02 y MyParent02 no importa

package com.ruyidd.classloader;

/**
 * @author: tianxc
 * @date: 2020-03-10 16:55
 * @desc:
 */
public class Demo02 {
    public static void main(String[] args) {
        //直接从常量池中获取
        System.out.println(MyParent02.str);
    }

}
class MyParent02{
    public static final String str = "hello world";
//
    static {
        System.out.println("MyParent02 static");
    }
}

package com.ruyidd.classloader;

import java.util.UUID;

/**
 * @desc: 当一个常量的值并非编译的期间可以确定的,
 * 那这个值就不会被放入方法调用类的常量池中
 * 程序运行期间的时候,会主动使用常量所在的类
 */
public class Demo03 {

    public static void main(String[] args) {
        System.out.println(MyParent03.str);
    }
}

class MyParent03{
    public static final String str = UUID.randomUUID().toString();

    static {
        System.out.println("MyParent03 static");
    }
}

clasificación ClassLoader

  1. Java Virtual Machine que viene con cargador
    • BootStrap raíz cargador (para sistema de carga, las clases de JDK en la rt.jar biblioteca núcleo)
    • cargador de clase ext extensión (carga extendida alguna clase de paquete jar)
    • Sys / sistema de aplicación (clase de aplicación) del cargador (escribir nuestras propias clases)
  2. cargador definido por el usuario
    • Cargador de clases, sólo es necesario extender esta clase abstracta puede definir su propio cargador de clases

package com.ruyidd.classloader;

/**
 * @author: tianxc
 * @date: 2020-03-10 17:17
 * @desc:
 */
public class Demo04 {

    public static void main(String[] args) {
        Object o = new Object();
        Demo04 demo04 = new Demo04();
//null 在这里并不代表没有,只是Java触及不到
        System.out.println(o.getClass().getClassLoader());//null
        System.out.println(demo04.getClass().getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2


        System.out.println(demo04.getClass().getClassLoader().getParent());//sun.misc.Launcher$ExtClassLoader@1b6d3586
        System.out.println(demo04.getClass().getClassLoader().getParent().getParent());//null


    }
}

Los padres nombran a mecanismos: un nivel por lo que la clase padre de la carga, si la parte superior del cargador no puede cargar, y luego así sucesivamente.

Los padres delegan mecanismo para proteger a las clases del núcleo de Java no será reemplazado por su propia definición de la clase

5.native: método local

orígenes: Mientras esta es la palabra clave, lo que indica el alcance de Java no sólo para llamar a la librería del lenguaje de C subyacente

robot de clase

JNI: Java Native Entero (Java interfaz de método nativo)

6. Contador de Programa

Cada hilo tiene un contador de programa, el hilo privado.

El contador de programa es un espacio muy pequeño de memoria :( casi insignificante)

Acción: El número de línea de ejecución indicador de código de bytes actual.

bipushEl int, float, String, empujado al valor constante pila;

istore Almacenar un valor de pila de operandos en la tabla de variables locales

iaddmás

imul Multiplicar

7. El área método

Método Area área método es uno de la zona de datos de tiempo de ejecución Java Virtual Machine Especificación define, y el montón (Heap), como puede ser compartida entre los hilos

antes JDK1.7

Generación Permanente: se utiliza para almacenar parte de la máquina virtual a la información de clase de carga, constantes, cadenas y variables estáticas. Estas cosas van a poner una generación permanente, el tamaño del espacio de generación permanente es limitada: si completa: OutOfMemoryError: PermGen

JDK1.8

(HotSpot JVM jdk1.8 en el momento) sería perpetua generaciones eliminadas por completo, montón de Java o metaespacio (Nativo Montón) Espacio elemento

Yuan es el camino para lograr área de espacio en la JVM HotSpot

El método es principalmente para ahorrar área: información de clase, constantes, una cadena, una variable estática, un símbolo de referencia, el código del método

Generación y espacio dimensional permanente se consiguen método de especificación zona JVM.

Yuan y espacio permanente en nombre mayor diferencia: el espacio tridimensional no está en la máquina virtual de Java, utilizando una memoria local.

-XX:MetaspaceSize10m

Si el espacio está lleno de yuanes: OutOfMemoryError: metaespacio

8. Pila (Stack)

Las pilas y las colas (pilas y colas son la estructura básica de datos).

Las pilas y las colas son la estructura básica de datos:

El programa se está ejecutando en realidad es impulsar el proceso.

La pila está vacía, el hilo ha terminado.

¿Qué es la Pila Pila

pila de tiempo de ejecución es el programa de gestión

Algunos tipos básicos de valores de referencia almacenados objetos, métodos y similares. . .

Pila ventajas: velocidad de acceso rápido que el reactor, después del registro, los datos de la pila no se pueden compartir.

desbordamiento de pila StackOverflowError

public class Demo01 {

    public static void main(String[] args) {
        a();
    }
//Exception in thread "main" java.lang.StackOverflowError
    private static void a(){
        a();
    }
}

Pila que ciertamente no es un problema de la recolección de basura, siempre y cuando el hilo Una vez terminado, la pila ha terminado, ciclo de vida y la consistencia hilo.

principio de la pila

Elementos constitutivos de la pila de Java: el marco de pila

Stack (¿Qué depósito?) + + Heap interacción diagrama área método

depósito de pilas: tabla de variables locales, los tipos básicos de datos (int, double ...), las referencias a objetos, el método de indexación ...

Este es nuestro principal HotSpot pila (puntero)

3 JVM:

  • HotSpot de SUN
  • JRockit de BEA
  • J9vm de IBM

9. montón (Heap)

Java7 antes:

pila Pila, una pila de JVM sólo un ejemplo, el tamaño de la memoria es ajustable.

Puede guardar contenido: clases, métodos, constantes, es cierto tipo de información de referencia.

Dividido en tres partes:

  • región Neonatal: Young (Eden-s0-s1)
  • Distrito de pensiones: la tenencia Viejo
  • Permanente Campo: Perm

la pila de memoria lógicamente divide en tres partes: recién nacido, pensiones, permanente (en adelante denominado elemento espacio JDK1.8)

Sólo físicamente recién nacido, de pensiones; elemento en el espacio de memoria local, no en la JVM.

recolección de basura GC principalmente en el área de generación y pensiones joven, se divide en ordinaria y GC GC completa, si se llena, estallará OutOfMemoryError

la generación de jóvenes

La generación joven es una clase de nacimiento, desaparición de crecimiento de lugar

Los segmentos de generación de jóvenes: Eden, S0, S1 (de, a), todas las clases han estado fuera en el nuevo Edén, Edén lentamente cuando está llena, el programa también necesita crear un objeto y que dará lugar a una ligera GC; limpiarse después de objetos de basura va a sobrevivir, vamos a poner la zona de sobrevivientes (s0, s1), después de la limpieza de 15 veces, ha habido algunos objetos extremadamente tenaces, algunos objetos se rompen a través de la basura 15 veces después de eso, en esta ocasión será el objeto en el área de pensiones, correr durante unos meses, el área de pensiones está lleno, se disparará un GC completa; si todo el espacio se llena por completo, en el OOM.

Sun HotSpot máquina virtual, la gestión de memoria (mecanismo de gestión generacional, las diferentes regiones utilizan diferentes algoritmos.)

Eden de a

área de pensiones

15 objetos han sobrevivido en el área de pensiones, después de que el área de pensiones está lleno, el gatillo completa GC

El valor por defecto es 15 veces, puede ser modificado

región Permanente (Perm)

JDK puso algunos llevan su propia clase, los metadatos de enteros

Apenas la recolección de basura:

OutOfMemoryError: PermGen cuando el proyecto comenzó representación permanente no es suficiente: Es posible cargar un gran número de paquetes de terceros.

Antes jdk1.6: método permanente generación en el área de la piscina constante

jdk1.7: nombre permanente, pero empezó a tratar de generaciones permanentemente, piscina constante en el montón

jdk1.8: no generación de espacio permanente, sustituido miembros; piscina constante en el espacio de elementos.

Método y región montón, es un área común, es una parte lógica de la especificación de JVM, también referido a él como no montón

espacio dimensional: una memoria local

10. La optimización de la memoria heap (inicial)

Ajustar una prueba:

package com.ruyidd.heap;

/**
 * 默认情况
 * maxMemory=3791650816(字节) 3616.0MB(虚拟机试图使用的最大的内存 一般是物理内存的1/4)
 * totalMemory=257425408(字节)    245.5MB(虚拟机默认初始内存总量 一般是物理内存的1/64)
 *
 * 我们可以自定义堆内存的总量:
 * -XX:+PrintGCDetails;//输出详细的垃圾回收信息
 * -Xmx:最大分配内存 1/4
 * -Xms:初始分配的内存大小1/64
 * -Xmx1024m -Xms1024m -XX:+PrintGCDetails
 */
public class Demo01 {

    public static void main(String[] args) {
        //获取堆内存的初始大小和最大大小
        long maxMemory = Runtime.getRuntime().maxMemory();
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("maxMemory="+maxMemory+"(字节)\t"+(maxMemory/1024/(double)1024)+"MB");
        System.out.println("totalMemory="+totalMemory+"(字节)\t"+(totalMemory/1024/(double)1024)+"MB");
    }
}

Prueba dos: OOM

package com.ruyidd.heap;

import java.util.Random;

/**
 * -Xmx8m -Xms8m -XX:+PrintGCDetails
 *
 * [GC (Allocation Failure) [PSYoungGen: 1536K->488K(2048K)] 1536K->640K(7680K), 0.0009800 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
 * [Full GC (Ergonomics) [PSYoungGen: 1981K->0K(2048K)] [ParOldGen: 4775K->2733K(5632K)] 6757K->2733K(7680K), [Metaspace: 3204K->3204K(1056768K)], 0.0039491 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * 1. GC类型:GC——普通GC;Full GC——重GC
 * 2. 1536K 执行GC之前的大小
 * 3. 488K 执行GC之后的大小
 * 4. (7680K) young 的total大小
 * 5. 0.0009800 secs清理的时间
 * 6. user 总计GC所占用CPU的时间  sys os调用等待的时间 real 应用暂停的时间
 *
 * GC的执行方式:串行执行STW(stop The World);并行执行:G1
 */
public class Demo02 {

    public static void main(String[] args) {
        String str = "lkasjdflkajlfkjakdjfalkdsfj";
        while (true){
            str += str
                    + new Random().nextInt(999999999)
                    + new Random().nextInt(999999999);
        }
        //出现的问题 java.lang.OutOfMemoryError: Java heap space
    }
}

instantánea de la memoria 11.Dump

Ver herramienta:

  1. jconsole
  2. Eclipse (MAT)
  3. Idea (Jprofile plug-in)

enchufe Jprofile

La experiencia rápida

Supongo que te gusta

Origin www.cnblogs.com/tianxc/p/12459660.html
Recomendado
Clasificación