Red de conocimiento informático - Conocimiento informático - Cómo lidiar con objetos y desbordamientos de memoria

Cómo lidiar con objetos y desbordamientos de memoria

1. Objeto.

Crear. Primero verifique si los parámetros de la instrucción pueden encontrar la referencia del símbolo de la clase en el área constante y verifique si la clase se ha cargado, analizado e inicializado. En caso contrario se ejecuta el proceso de carga de clases. En segundo lugar, la asignación de memoria. Después de cargar la clase, sabrá cuánta memoria asignar. Hay dos métodos de asignación. Una es la colisión de punteros, es decir, se utiliza una parte de la memoria y la otra no. Si la memoria se divide mediante punteros, el puntero de memoria recién asignado se moverá a la posición libre y la máquina virtual compacta chocará con el puntero. La otra es la lista libre, que es una lista que registra bloques de memoria libres y la lista se actualiza constantemente. La memoria recién asignada encuentra un bloque de memoria del tamaño apropiado en la lista vinculada y la máquina virtual con función de barrido utiliza la lista vinculada libre. En tercer lugar, también se debe considerar la concurrencia al asignar espacio de memoria. Hay dos métodos, uno es el procesamiento sincrónico, como usar CAS, y reintentar después de una falla, el otro es dividir la acción de asignación de memoria en diferentes espacios según el subproceso; Cada subproceso asigna una pequeña porción de memoria en el montón por adelantado, y el subproceso local asigna un búfer TLAB. Ese subproceso necesita asignar memoria en ese TLAB, y solo cuando el TLAB se agota se puede bloquear y reasignar sincrónicamente. Cuarto, realice las configuraciones necesarias para el objeto, como a qué clase pertenece el objeto, cómo encontrar la información de metadatos de la clase, el código hash del objeto y la edad de generación de GC del objeto, etc.

B. El diseño de la memoria del objeto. Dividido en encabezado de objeto, datos de instancia y relleno de alineación. El encabezado del objeto consta de dos partes. La primera parte es almacenar información sobre el objeto en sí, como el código hash, la edad de generación del GC, el estado de bloqueo, etc. La segunda parte es el puntero de tipo, el puntero de un objeto a los metadatos de su clase, a través del cual la máquina virtual determina que se trata de una instancia de esa clase.

Ubicación de acceso al objeto. Hay dos formas, una es el acceso al identificador, el grupo de identificadores tiene punteros para acceder a los datos de la instancia del objeto y punteros para acceder a los tipos de datos del objeto. La mayor ventaja de este tipo de acceso es que la referencia es una dirección estable del grupo de identificadores. Los cambios en el objeto cambiarán el puntero en el grupo de identificadores, pero la referencia en sí no se moverá. El otro es un puntero directo, que tiene punteros a datos de tipo de objeto y datos de instancia. La ventaja de este acceso es que es más rápido y ahorra el coste de posicionamiento de un puntero.

2. Desbordamiento de memoria OOM.

A. Desbordamiento del montón. El montón almacena instancias de objetos. Siempre que se creen objetos constantemente y haya una ruta grande desde la raíz del GC hasta los objetos para evitar que la recolección de basura los elimine, la cantidad de objetos alcanzará el límite máximo de capacidad del montón. Analícelo utilizando herramientas de análisis de imágenes de memoria y el analizador de memoria Eclipse.

B. Desbordamiento de la pila de máquinas virtuales y de los métodos locales. Hay dos tipos: uno es lanzar una excepción StackOverFlowError cuando la profundidad de la pila solicitada por el subproceso es mayor que la profundidad máxima permitida por la máquina virtual y el otro es lanzar una excepción OutOfMemoryError cuando la máquina virtual no puede solicitar suficiente espacio de memoria; al expandir la pila. Puede reducir el tamaño máximo de montón y pila para obtener más subprocesos.

C. Área de método y desbordamiento constante de la piscina. Habrá indicaciones adicionales para el espacio PermGen.

D. Desbordamiento de memoria directa local. El uso de la memoria no se puede ver en este archivo de volcado del montón, pero si NIO se usa directa o simplemente, puede ser un desbordamiento de memoria directo local.