Área de datos de tiempo de ejecución de JVM, ejemplos comunes de excepciones de jvm

Área de datos de tiempo de ejecución de JVM:

  • Durante la ejecución de un programa Java, la máquina virtual Java divide la memoria que gestiona en varias áreas de datos diferentes.

Montón :

  • Compartir hilo
  • Almacenamiento: más creado 实例对象, 数组, 字符串常量池;
  • Descripción:
    - La referencia del objeto se almacena en , apuntando a la dirección donde el objeto está almacenado en el montón
    - El objeto en la memoria del montón almacena sus propias variables miembro y no guarda los métodos del objeto, que 方法se guardan en la pila de marcos. .
  • Parámetros: -Xms1G- Memoria de montón inicial -Xmx1G- memoria de montón máxima; tamaño predeterminado
    - valor inicial predeterminado, 64/1la memoria física máxima 1/4; calculado en base a 8G de memoria, es decir128M ~ 2G
  • Reciclaje de memoria: nueva generación, vieja generación - 1:2; nueva generación:eden 、s1 、s2 - 8:1:1
  • Algoritmo de reciclaje:
    – Nueva generación 复制算法: divide la memoria de nueva generación disponible en dos áreas s1 y s2. Solo se utiliza un área a la vez. Cuando se recicla un área, los objetos supervivientes en esta área se copian a otra área. Vacíe la actual área.- eden + s1 - > s2 , eden + s2 ->1
    Generación anterior 标记压缩: marque todos los objetos referenciados desde el nodo raíz, comprima y mueva todos los objetos supervivientes a un extremo de la memoria y borre los objetos basura restantes.

1
2

Desbordamiento de memoria del montón ( java.lang.OutOfMemoryError)

La adición de bucle de lista, generalmente puede aparecer en:大批量添加数据

  • Todo general, agregar Lista en lotes e importar a la base de datos
		List<User> list=new ArrayList<>();
        while(true){
    
    
            list.add(new User().setName("小树"));
        }

Al procesar archivos grandes IO:

//size 声明 多 ~~大 ,比如: new byte[in.available()];
byte[] buffer = new byte[size] //1024 * 1024 * 5

Manejo de excepciones: para detectar este tipo de excepción, utilícelo Throwable ey luego manéjelo en consecuencia

		try {
    
    
			//TODO
        } catch (Throwable e) {
    
    
            e.printStackTrace();
        }

pila de máquina virtual java:

  • El área privada del subproceso tiene el mismo ciclo de vida que el subproceso; cuando se ejecuta cada método, la máquina virtual Java creará sincrónicamente un marco de pila (Stack Frame)
  • Almacenamiento: el marco de la pila almacena la tabla de variables locales del método, la pila de operandos, la conexión dinámica y la dirección de retorno del método.
  • Proceso: el proceso desde cada método que se llama hasta la finalización de la ejecución corresponde al proceso de este marco de pila en la pila de la máquina virtual desde 入栈hasta - captura de pantalla tomada a: dirección出栈
  • parámetro:-Xss<size>
    1

Desbordamiento de pila ( java.lang.StackOverflowError):

  • Método de llamada recursiva. El nivel de llamada al método es demasiado profundo y la memoria no es suficiente para crear un nuevo marco de pila.
private static int count;

    public static void count(){
    
    
        try {
    
    
            count++;
            count();
        } catch (Throwable e) {
    
    
            System.out.println("最大深度:"+count);
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
    
    
        count();
    }

Área de métodos: información de clase Java, grupo constante de tiempo de ejecución, variables estáticas

  • JDK1.7 y anteriores se denominan Permgeneración permanente 堆中. Almacenamiento: información de clase Java, grupo constante de tiempo de ejecución, variables estáticas, código compilado por un compilador justo a tiempo y otros datos
  • JDK 1.8, llamado 元空间 MetaSpace, en 直接内存中. Almacenamiento: la información de clase y los grupos constantes se colocan en la memoria local, y los grupos constantes y las variables estáticas se colocan en el montón de Java.
  • parámetro:-XX:MaxMetaspaceSize

Contador de programa: guarda la dirección de la instrucción de código de bytes que está ejecutando el bloqueo de subproceso actual para volver a la posición de ejecución normal después del cambio de subproceso.

Pila de métodos nativos: el método nativo, JNI, utiliza Java para llamar a la biblioteca de métodos locales implementada en c y c++.

Supongo que te gusta

Origin blog.csdn.net/hesqlplus730/article/details/123760581
Recomendado
Clasificación