[JVM] Desbordamiento de memoria y pérdida de memoria

Pérdida de memoria : La pérdida de memoria significa que después de que el programa solicita memoria, no puede liberar el espacio de memoria asignado. Puede que una pérdida de memoria no parezca tener un gran impacto, pero la consecuencia de las pérdidas de memoria acumuladas es el desbordamiento de la memoria.

Desbordamiento de memoria sin memoria : cuando un programa solicita memoria, no hay suficiente memoria para que la utilice el solicitante.

Clasificación de pérdidas de memoria (clasificadas según cómo ocurren)

  1. Pérdidas frecuentes de memoria . El código con pérdidas de memoria se ejecutará varias veces, lo que provocará una pérdida de memoria cada vez que se ejecute.
  2. Pérdidas de memoria esporádicas . El código que causa pérdidas de memoria solo ocurrirá bajo ciertas circunstancias u operaciones. Frecuentes y esporádicas son relativas. En determinadas circunstancias, lo ocasional puede volverse común. Por tanto, el entorno de prueba y los métodos de prueba son cruciales para detectar pérdidas de memoria.
  3. Pérdida de memoria única . El código que causa una pérdida de memoria solo se ejecutará una vez o, debido a fallas algorítmicas, siempre habrá solo un bloque de memoria perdido. Por ejemplo, si se asigna memoria en el constructor de una clase, pero no se libera memoria en el constructor, la pérdida de memoria solo ocurrirá una vez.
  4. Pérdida de memoria implícita . El programa asigna memoria continuamente mientras se ejecuta, pero no la libera hasta el final. Estrictamente hablando, aquí no hay pérdida de memoria, porque el programa finalmente libera toda la memoria solicitada. Pero para un programa de servidor que necesita ejecutarse durante días, semanas o incluso meses, no liberar memoria a tiempo también puede provocar el agotamiento de toda la memoria del sistema. Por lo tanto, a este tipo de pérdida de memoria lo llamamos pérdida de memoria implícita.

Causas y soluciones al desbordamiento de la memoria.

Causa del desbordamiento de la memoria

        1. La cantidad de datos cargados en la memoria es demasiado grande, como recuperar demasiados datos de la base de datos a la vez;

        2. Hay una referencia al objeto en la clase de colección, que no se borra después de su uso, lo que hace imposible que la JVM lo recicle;

        3. Hay un bucle infinito en el código o el bucle genera demasiadas entidades de objetos duplicados;

        4. ERROR en el software de terceros utilizado;

        5. El valor de la memoria del parámetro de inicio está configurado demasiado pequeño.

Solución de desbordamiento de memoria

        El primer paso es modificar los parámetros de inicio de JVM y aumentar directamente la memoria. (No olvide agregar los parámetros -Xms y -Xmx).

        El segundo paso es verificar el registro de errores para ver si hay otras excepciones o errores antes del error "OutOfMemory".

        El tercer paso es recorrer y analizar el código para descubrir dónde puede ocurrir un desbordamiento de la memoria.

        Concéntrese en los siguientes puntos:

        1. Verifique si hay una consulta para obtener todos los datos a la vez en la consulta de la base de datos. En términos generales, si se recuperan cien mil registros en la memoria a la vez, se puede provocar un desbordamiento de la memoria. Este problema está relativamente oculto. Antes de conectarse, había menos datos en la base de datos y era menos probable que causara problemas. Después de conectarse, había más datos en la base de datos y una sola consulta podría causar un desbordamiento de la memoria. Por lo tanto, intente utilizar paginación para consultas de bases de datos, especialmente para sistemas grandes.

        2. Compruebe si hay bucles infinitos o llamadas recursivas en el código.

        3. Compruebe si hay un bucle grande que genera repetidamente nuevas entidades de objetos.

        4. Compruebe si los objetos de la colección, como Lista y Mapa, no se borran después de su uso. Los objetos de colección, como Lista y Mapa, siempre tendrán referencias a los objetos, lo que hará que GC no pueda reciclar estos objetos.

        Paso 4 : utilice la herramienta de visualización de memoria para ver dinámicamente el uso de la memoria

Supongo que te gusta

Origin blog.csdn.net/xudahai513/article/details/125826734
Recomendado
Clasificación