Vous êtes sur la page 1sur 8

19-8-2013

Manejo de memoria de la mquina virtual de JAVA

Gonzalo Soto Moreno

Introduccin
La mquina virtual de Java se podra definir para su fcil entendimiento como un puente que trabaja a un nivel superior que el hardware donde se pretende ejecutar una aplicacin, que entiende tanto el bytecode como el sistema que se pretende ejecutar. Es decir, una mquina virtual java es una mquina virtual de proceso nativo que es creada para una plataforma en especfico, capaz de interpretar y ejecutar bytecode, el cual es generado por el compilador de Java. La JVM provee definiciones para un conjunto de instrucciones, un conjunto de registros, un formato para archivos de clases, la pila, un rea de memoria y un heap para el recolector de basura. En el presente informe se abordar con mayor detalle los temas referentes a la JVM de manejo de memoria, la pila y el heap.

Manejo de memoria
Para comenzar a desarrollar este tema, en una primera instancia es necesario hacer notar algunos conceptos propios de este mbito: Zona de datos: Es donde se almacenan las instrucciones del programa, las clases con sus mtodos y constantes. Esta zona de memoria es fija, y no se puede modificar durante la ejecucin. Stack: Los datos que se almacenan aqu son las referencias a objetos (instancias de objetos) y los datos primitivos como int, float o char. Cuando se ejecuta un mtodo con variables locales, estas se cargan en el Stack y se eliminan una vez se finaliza el mtodo. El tamao del Stack se define durante el tiempo de compilacin y es esttico durante su ejecucin, por lo que puede llegar un momento en que se llene, lanzando as un OutOfMemoryException. Heap: es la zona de memoria dinmica, almacena los objetos que se crean, en un principio tiene un tamao fijo asignado por la JVM, pero segn es necesario se va aadiendo ms espacio. Concretamente es el lugar donde se crean los objetos con la sentencia new.

Una vez definidos los conceptos anteriores, podemos hacer notar una caracterstica considerable que utiliza Java a travs de la JVM, la cual es la gestin dinmica de memoria. Es decir, se asignarn variables segn se vayan creando en la memoria heap y se liberar automticamente esta memoria cuando no se necesita ms por un proceso de la mquina virtual de Java (JVM) llamado Garballe Collector (GC). Que se realice este proceso tiene ventajas como que no tenemos que preocuparnos por asignar y desasignar memoria, puesto que es un proceso dinmico. Adems la JVM internamente utiliza una optimizacin llamada anlisis de escape (en ingls scape analysis) que realiza comprobaciones para saber si un objeto se utiliza slo en un thread o un mtodo y crearlo en la memoria STACK, incrementando el rendimiento de los programas. Sin embargo este manejo de memoria tambin produce ciertas desventajas, por ejemplo el programador no controla donde se quiere asignar memoria. Este hecho se comporta como desventaja debido a que a veces el programador desea almacenar un objeto en memoria Stack porque es menos costoso que almacenarlo en memoria heap.

El recolector de basura
A grandes rasgos el recolector de basura es un proceso automtico de baja prioridad que se ejecuta dentro de la JVM. Su funcin es limpiar la memoria del heap que no se est utilizando y que podra ser utilizada por otros programas. Pero cmo sabe el recolector que elementos del heap no se estn utilizando? La respuesta a esta pregunta nace de la estrecha relacin del stack y el heap, es decir, un objeto podr ser limpiado cuando desde el stack ninguna variable haga referencia a ese objeto. El proceso de recoleccin de basura tambin se puede ejecutar manualmente desde un programa Java si se cree que en un punto determinado se ha podido dejar muchos objetos sin referenciar.

Adems se puede calcular la memoria libre en la JVM y la memoria mxima:

Al comienzo de este informe se mencion una idea general sobre el heap y stack, a continuacin se abordarn con mayor detalle.

Heap
El heap es el espacio de memoria en tiempo de ejecucin que se usa para almacenar las instancias de clases, objetos y arrays. Se crea en el inicio de la mquina virtual y es gestionado por el Garbage Collector. Se puede mdificar el tamao del heap mediante comandos de la JVM: mnimo (-Xms512m) y mximo (-Xmx1024m). Tambin se puede aumentar o disminuir bajo demanda automticamente. Cuando el Garbage Collector reserva espacio de almacenamiento en el heap para un objeto, este sigue vivo mientras exista una referencia a l en la JVM activa (referencia en Stack). Cuando este objeto deja de estar referenciado desde el estado activo, se convierte en basura y permite que ese espacio de heap sea reclamado para su uso. Cuando esto sucede, el recolector de basura debe procesar la finalizacin del objeto y asegurarse de que todos los recursos de la JVM usados por ese proceso vuelvan a estar disponibles en el pool correspondiente.

Stack
La pila de llamadas tiene un comportamiento LIFO, es decir, el ltimo elemento en ingresar es el primero en salir. Cuando empieza la ejecucin, la pila est inicialmente vaca. En el transcurso de la ejecucin, seguro que se efectan llamadas a otras funciones (o mtodos). El Stack es un espacio permanente en la que se almacenan las variables locales de cada funcin o mtodo que se ejecuta, parmetros o valores de retorno. Cuando finaliza la ejecucin de la funcin, las variables locales se liberan y dejan de ocupar memoria. Lo ms importante es saber que el stack tiene un tamao fijo que se asigna al comienzo de la ejecucin del proceso y depende de la plataforma donde se est ejecutando. Si se llena el stack, no se podra modificarlo y se obtendr el error StackOverflowError. En el stack tambin se almacenan referencias a otros objetos almacenados en la memoria y esto es clave para poder liberarlos.

Diferencias entre Heap y Stack


A continuacin se presentar una tabla comparativa que muestra las tareas que realmente realizan y almacenan el Heap y el Stack:

A modo de ejemplo se presenta el siguiente cdigo de la clase heapYStack, con las respectivas asignaciones que se realizan en el Heap y Stack:

Comienza la ejecucin del cdigo con main. Se declara e inicializa una variable de tipo primitivo, enteroLocal. Se almacena esta variable y su valor en el Stack. Se declara e inicializa una variable de tipo de referencia. La variable se crea en el Stack. El objeto se crea en el Heap. La variable apunta al objeto String en el Heap. Se llama al constructor EjemploStackAndHeap(). El constructor crea en el Heap el espacio para el objeto y sus atributos. Se inicializan los valores segn el tipo de los atributos. En el Stack se crea la variable de referencia e que apunta al objeto en Heap. Se llama a setAtributoEntero con el parmetro enteroLocal. La variable del mtodo setAtributoEntero x recibe el valor de enteroLocal. Se le asigna el valor de x a atributoEntero. (El mtodo tiene una variable this que apunta al objeto, de esta forma puede acceder a sus atributos). Se llama a setAtributoCadena con el parmetro cadenaLocal. La variable del mtodo setAtributoCadena s recibe el valor de cadenaLocal. Se le asigna el valor de s a atributoCadena. (El mtodo tiene una variable this que apunta al objeto, de esta forma puede acceder a sus atributos).

Conclusin
Mediante el desarrollo de este tema aprend nuevos conceptos que son muy valiosos a la hora de entender el manejo de memoria en JAVA, como son el heap y stack. Sin embargo con el estudio me percate que el tema de manejo de memoria involucra muchos otros conceptos, que para m eran totalmente desconocidos y no eran tomados en cuenta a la hora de programar. Adems es necesario hacer notar que si bien el manejo automtico de memoria es un punto a favor para programadores, quita un poco de libertad a los mismos al momento de elegir un tipo de espacio de memoria u otro. Por ltimo puedo acotar que esta pequea investigacin permite acercarse a mi objetivo final del curso, el cual es formar una base de conocimiento que me permita rendir una buena prueba de acreditacin en Java.

Vous aimerez peut-être aussi