Programación Java para evitar el desbordamiento de memoria

Transferencia desde: https://blog.csdn.net/bazingaman/article/details/24576885

 

En Java, una pérdida de memoria es la existencia de algunos objetos asignados. Estos objetos tienen las siguientes dos características. Primero, estos objetos son accesibles, es decir, en un gráfico dirigido, hay una ruta que se puede conectar a ellos; segundo, estos objetos son inútiles Es decir, el programa no usará estos objetos en el futuro. Si el objeto cumple estas dos condiciones, estos objetos pueden determinarse como una pérdida de memoria en Java, estos objetos no serán recopilados por el GC, pero consumen memoria. En C ++, el alcance de la pérdida de memoria es mayor. A algunos objetos se les asigna espacio de memoria, pero luego no se puede acceder, ya que no hay GC en C ++, la memoria nunca se recuperará. En java

 En GC , el GC recopila estos objetos inalcanzables , por lo que el programador no necesita tener en cuenta esta parte de la pérdida de memoria. A través del análisis, podemos saber que para C ++, los programadores necesitan administrar los bordes y los vértices ellos mismos, mientras que para los programadores de Java, solo necesitan administrar los bordes (no es necesario administrar los vértices)

Lanzamiento). De esta manera, Java mejora la eficiencia de la programación.

Ejemplo de pérdida de memoria

Ejemplo 1

En este ejemplo, aplica iterativamente para el objeto Object y coloca el objeto aplicado en un Vector. Si solo se libera la referencia en sí, el Vector todavía hace referencia al objeto, por lo que este objeto no es reciclable para GC. Por lo tanto, si el objeto se agrega al Vector, también debe eliminarse del Vector. La forma más fácil es establecer el objeto Vector en nulo.

Vector v = nuevo Vector (10);

para (int i = 1; i <100; i ++)

{Object o = new Object ();

v.add (o);

o = nulo;

}

En este momento, no se han liberado todos los objetos Object, porque la variable v se refiere a estos objetos. Realmente inútil, pero el objeto al que se hace referencia, GC es impotente (de hecho, GC cree que sigue siendo útil), esta es la causa más importante de pérdidas de memoria.

(1) Si desea liberar el objeto, debe hacer que su referencia cuente 0, y solo aquellos objetos que ya no están referenciados pueden liberarse. Este principio es muy simple, pero es muy importante. Es la causa básica de las pérdidas de memoria y también es una solución. El propósito del método de pérdida de memoria;

(2) El programador no necesita gestionar el proceso específico de asignación y liberación del espacio del objeto, pero debe prestar atención a si el recuento de referencia del objeto liberado es 0;

(3) Hay varios tipos de procesos a los que otros objetos pueden hacer referencia a un objeto:

a) Asignación directa, como en el ejemplo anterior, Aa = E;

b) Pasado por parámetros, como public void addObject (Object E);

c. Otras situaciones como las llamadas al sistema.

————————————————

Varias causas principales de pérdidas de memoria :

Referencias a clases de colección estática , oyentes, conexiones físicas, clases internas, módulos externos, etc.

1. Liberar referencias a objetos inútiles lo antes posible (XX = nulo;)   

2. Utilice los tipos de datos de recopilación con precaución, como matrices, árboles, gráficos, listas vinculadas y otras estructuras de datos, que son más complicadas para que GC las recicle. 3. Evite solicitar explícitamente el espacio de matriz.Cuando tenga que aplicar explícitamente, intente estimar su valor razonable con la mayor precisión posible. 4. Intente evitar crear e inicializar una gran cantidad de objetos en el constructor predeterminado de la clase para evitar el desperdicio innecesario de recursos de memoria al llamar a su propio constructor de clase 5. Intente evitar forzar al sistema a reciclar la memoria basura y aumentar el sistema para hacer La hora final de la recolección de basura 6. Intente utilizar variables de valor instantáneo para el desarrollo de aplicaciones de invocación de métodos remotos, a menos que el llamante remoto necesite obtener el valor de la variable de valor instantáneo.

7. Intente utilizar la tecnología de agrupación de objetos en escenarios apropiados para mejorar el rendimiento del sistema

————————————————

Prevenir y detectar pérdidas de memoria

Después de comprender algunas de las causas de las pérdidas de memoria, debe evitar y descubrir las pérdidas de memoria tanto como sea posible.

(1) Buenos hábitos de codificación. La sugerencia más básica es liberar referencias a objetos inútiles lo antes posible La mayoría de los programadores usan variables temporales para establecer automáticamente la variable de referencia en nulo después de salir del dominio activo. Al utilizar este método, debe prestar especial atención a algunos gráficos de objetos complejos, como matrices, columnas, árboles, gráficos, etc., y la relación de referencia mutua entre estos objetos es más complicada. Para tales objetos, la recuperación de GC es generalmente ineficiente. Si el programa lo permite, asigne objetos de referencia no utilizados a nulo lo antes posible. Otras sugerencias

Después de confirmar que un objeto es inútil, establezca explícitamente todas sus referencias en nulo;

Cuando la clase hereda de Jpanel o Jdialog u otras clases de contenedor, es posible que desee llamar a su método removeall () antes de eliminar el objeto; antes de establecer una variable de referencia en un valor nulo, debe prestar atención a si el objeto señalado por la variable de referencia es monitoreado, si Sí, primero debe eliminar el oyente antes de poder asignar un valor nulo; cuando el objeto es un subproceso, es posible que desee llamar a su método interrupt () antes de eliminar el objeto; durante el proceso de detección de memoria, no solo debe prestar atención al objeto de clase que escribió, sino también También preste atención a algunos tipos básicos de objetos, como: int [], String, char [], etc.; si hay una conexión de base de datos, use try ... finally

 Estructura, cierre Objeto de declaración y conexión finalmente.

(2) Buenas herramientas de prueba. La pérdida de memoria no se puede evitar por completo durante el desarrollo. La clave es utilizar una buena herramienta de prueba para localizar rápidamente el problema cuando se encuentra una pérdida de memoria. Existen varias herramientas profesionales para inspeccionar las fugas de memoria de Java en el mercado. Sus principios de funcionamiento básicos son similares. Todos ellos monitorean, analizan y analizan toda la información sobre la administración de memoria al monitorear el tiempo de ejecución del programa Java, todas las aplicaciones de objetos y las acciones de liberación. Visualización. Los desarrolladores utilizarán esta información para determinar si el programa tiene una pérdida de memoria. Estas herramientas incluyen Optimizeit

 Profiler, JProbe Profiler, JinSight, Rational's Purify, etc.

————————————————

Supongo que te gusta

Origin www.cnblogs.com/Limer98/p/12674005.html
Recomendado
Clasificación