miBlackBerry.com

Perdidas de Memoria – Interesante post

Leyendo mis RSS he visto este post de BLACKBERRY LATINO


WEB: http://blackberrylatino.com/2009/11/porque-se-pierde-memoria-interna-by-atilauno/


Aclara dudas aquellos del "Por que" esas perdidas/fugas de memoria

Escribo literalmente:


Fugas? ¿Qué son las fugas?


??Empecemos por aclarar cómo los desarrolladores pueden terminar con una pérdida de memoria en un entorno de desarrollo Java ®. La Java Virtual Machine (JVM) realiza la recolección de basura con la función de liberar la memoria asignada a los objetos y no hace referencia a nada en el sistema, esto pone a las aplicaciones de Java en una mejor posición que las aplicaciones en un entorno de programación como C + +, por ejemplo. Sin embargo, cuando un objeto que no es necesario ya que queda referenciado por otro objeto en su aplicación, el sistema JVM no tiene manera de saber que este objeto debe ser liberado. Esto es especialmente cierto si las instancias de ese objeto se ven acumuladas en el tiempo.


??Nuestra experiencia en el desarrollo del BlackBerry muestra que en la práctica uno de los casos más comunes para la creación de una pérdida de memoria es cuando el registro de oyentes para el sistema de actos a nivel – por ejemplo, al registrar tu propia carpeta de correo electrónico utilizando ApplicationMessageFolderListener. Sin embargo, una pérdida de memoria puede ser creada con sólo añadir una instancia de objeto al Global Runtime Store y no eliminarlo. Ésta es una aplicación muy simple que crea una fuga de memoria cada vez que se inicia:


import net.rim.device.api.system.Application;

import net.rim.device.api.system.RuntimeStore;

import java.util.Random;


class TestMemoryLeaks {

public static void main(String[] args) {

//create a memory leak by adding an item to the runtimestore and never removing it

RuntimeStore store = RuntimeStore.getRuntimeStore();

store.put((new Random()).nextLong(), new TestMemoryLeaks());

}

}


??Por supuesto, pérdidas de memoria también pueden existir en el ámbito de una solicitud, pero su impacto es limitado ya que se eliminan cuando se termina la aplicación (a menos que la aplicación está diseñada para ejecutarse siempre en el fondo). En esta categoría entran también todas las implementaciones de detectores registrados para la aplicación amplio ámbito de aplicación por ejemplo el AccelerometerListener. Para los listener como tal, el sistema subyacente utiliza WeakReferences, cuando la aplicación termina y no hay otros objetos que tengan referencias “fuertes” al listener, el sistema automáticamente eliminará la WeakReferences como tal y liberará los objetos.