Memoria de Java: espacio de almacenamiento dinámico y recolector de basura

Más información sobre cómo gestiona la memoria de Java a través de espacio de almacenamiento dinámico y recolección de basura. La comprensión de la asignación de memoria puede ayudar a evitar la pérdida de memoria en los programas de Java.

A+ A-

Recientemente, escribí una aplicación Java que, cuando se ejecuta, requiere un poco de memoria y empecé a obtener el error OutOfMemory:

 Error: java.lang.OutOfMemoryError: Java heap space 

Esto sucede a menudo cuando tenemos que ejecutar programas de memoria de alto consumo. Los siguientes son algunas maneras de resolver este tipo de problemas.

¿Cuál es el espacio de almacenamiento dinámico Java?

En primer lugar, vamos a entender lo que es espacio de almacenamiento dinámico. Bueno, Java utiliza la memoria principalmente en los arreglos de la pila y pila . Java mantiene los parámetros que se transmiten de un método de llamada a un método llamado , en forma de una estructura de pila (es decir, los parámetros son empujados dentro y salieron de la pila según la necesidad). Por otro lado, montón es un espacio de memoria acceder aleatoriamente donde Java crea y mantiene objetos. Java crea el objeto dentro de este espacio de almacenamiento dinámico donde encuentren un espacio suficiente para contener el objeto. Por lo tanto, cuando se crea un nuevo objeto (por ejemplo, la nueva cadena () ;) el objeto se crea en el espacio de almacenamiento dinámico y ocupa la memoria que se puede encajar. Durante la recogida de basura, Java libera el espacio de almacenamiento dinámico de los objetos que ya no se hace referencia. Pero si el número de referencia (es decir, "requerido") objetos sigue aumentando y no deferencia ellos -el JVM se queda sin el espacio de almacenamiento dinámico.

La cantidad de memoria que una clase requeriría depende del número y el tipo de sus miembros de datos.

  1. La clase en sí requiere mínimo de 8 bytes
  2. Cada miembro de datos requiere 4 bytes (requieren largo y doble 8 bytes). Incluso una variable booleana es usar 4 bytes a pesar de que sólo necesita un poco para llegar almacenado.
  3. Cantidad de memoria que crece en trozos de 8 bytes
Optimizar los programas Java

El primer paso para solucionar este problema debe ser ir a través del programa y ver cómo se podría modificarse con el fin de hacer que use menos memoria. Desde mucho el costo de la memoria ha sido extremadamente bajo en comparación con lo que era durante la década de 1960. Y los programadores se han vuelto bastante extravagante en términos de asignación de memoria para sus programas. Sin embargo, todavía, más a menudo que no, tenemos que escribir programas que requieren más memoria de la disponible. La frugalidad en el contexto del uso de la memoria siempre es bueno porque no sólo reduce las posibilidades de fallo en el programa, pero también a veces mejora la velocidad de ejecución.

Debe fijar objetos que ser nulo cuando ya no son necesarios en el código. Esto es aún más importante si se está ejecutando un bucle en el que se crea objeto (s), pero luego no descartas ellos cuando no son necesarios.

Hacer uso del método de recolector de basura de Java

El segundo paso hacia la optimización de uso de la memoria podría ser la de llamar explícitamente al método de recolección de basura. Java llama a este método de forma automática a medida que se requiere y libera el espacio de memoria que contiene los objetos que ya no se hace referencia. Pero también se puede llamar a este método explícitamente en el código (por ejemplo, después de un "gran tarea" se lleva a cabo y el próximo "gran tarea" está a punto de comenzar). Para llamar al recolector de basura, utilice:

 Runtime.getRuntime () gc ().; 

Puede supervisar el estado de la memoria antes y después del método GC () se llama.

 System.out.println ( "nnCalling basura Collectornn");
System.out.println ( "liberar memoria antes:" + Runtime.getRuntime () FreeMemory ().);
Runtime.getRuntime () gc ().;
System.out.println ( "la memoria después de:". + Runtime.getRuntime () FreeMemory ());
System.out.println ( "nnGarbage colección finishednn"); 

FreeMemory método () devuelve la cantidad de memoria libre disponible medido en bytes. Para otros métodos proporcionados por la clase Runtime ver Java API

Dar más memoria de JVM

Los esfuerzos para la optimización del uso de la memoria no obstante, a veces JVM en efecto, necesita más memoria. En estos casos podemos decir JVM a través de línea de comandos para utilizar una cantidad especificada de memoria:

 java -Xms2000m -Xmx3500m 

-Xms Y -Xmx cambia especificar la cantidad de espacio de intercambio (memoria virtual) que JVM puede utilizar en su máquina.

-Xms Especifica el mínimo (es decir, inicial) cantidad de memoria

-Xmx Especifica la cantidad máxima de memoria que podría utilizar JVM.

Estos valores de memoria deben ser especificadas en Megabytes.

Por lo tanto, se trataba de Java administra la memoria a través de espacio de almacenamiento dinámico y el mecanismo de recolección de basura. Estas son decisiones inteligentes y cada programador de Java deben tener claro entendimiento de cómo maneja Java memoria. Sólo podrás trabajar de manera eficiente en los programas que requieren mucha memoria.

Ads

Compartir