Optimizando aplicaciones J2ME (I) – Memoria
Escrito por blogElectronica en 4.PROGRAMACIÓNNo es lo mismo realizar aplicaciones para un Core 2 Duo que para un módulo embebido, como puede ser un módem Siemens / Cinterion TC65 ó XT65. Cuando desarrollamos aplicaciones para PCs convencionales, aunque debiéramos intentar optimizarlas, no vamos a notar grandes diferencias si gastamos unos cuantos cientos de KBytes de Ram más o menos, pues a día de hoy casi todo los ordenadores tienen de 1GB de Ram para arriba ni tampoco es crucial si no está todo lo optimizado que pudiera estar el código, cuando estamos hablando de procesadores a 3GHz. Esto es cambio, sí es muy importante para pequeños dispositivos embebidos.
Para el caso de los módulos embebidos hay dos maneras básicas de incrementar el rendimiento de las aplicaciones. Una es tener cuidado con el uso de la memoria, evitando utilizar más memoria de la necesaria. La otra es el tiempo de ejecución del código que implementamos. Por ejemplo en java, al igual que en cualquier lenguaje orientado a objetos, la creación y destrucción de objetos necesita de tiempo de procesador, además de requerir memoria cada objeto instanciado.
Voy a poner una serie de posts breves, por capítulos, sobre cosas a tener en cuenta a la hora de realizar aplicaciones J2ME, para obtener un mejor rendimiendo de las mismas.
Gestión de la memoria.
Como decía antes, la memoria de un dispositivo embebido es limitada y hay que tener especial cuidado con su uso. Si no tienes cuidado te puedes encontrar una excepción del tipo . Puedes pensar que tal vez lo mejor es ir liberando la memoria que vas dejando de usar (Garbage collector), pero eso va a tener un impacto negativo en tus programas, pues la liberalización de memoria por parte del Garbage Collector también requiere de un tiempo precioso de procesador.
¿Entonces, qué puedo hacer?
Lo mejor es optimizar el código usando sólo la memoria que necesites utilizar y evitando el crear y el destruir continuamente objetos, es decir, escoger bien qué objetos y cuando vamos a crearlos.
¿Es posible saber qué memoria tengo libre en un momento determinado en mi programa?
Sí, utilizando los métodos freeMemory() y totalMemory() de Runtime. Con freeMemory() podrás saber de cuanta memoria libre dispones para crear objetos en tu aplicación, mientras que con totalMemory() puedes saber el total de memoria en la KVM, es decir, en la máquina virtual de java.
Veámoslo con un ejemplo:
Runtime rt = Runtime.getRuntime();
long memoriaAntes=0, memoriaDespues=0, memoriaConsumida=0;
System.gc();
memoriaAntes = rt.freeMemory();
MiObjeto obj = new MiObjeto();
memoriaDespues = rt.freeMemory();
memoriaConsumida = before – after;
Con un ejemplo como el anterior podemos ver cual es el coste en memoria que tiene crear una nueva instancia de un objeto (objeto MyObject). De todas maneras para medir bien la memoria en el ejemplo tendríamos que añadir un “new MiObjeto();” justo antes de la llamada al Garbage Collector “System.gc();” , que como sabéis, sirve para liberar memoria de aquellos objetos que ya no son referenciados en el programa. Esto es porque la máquina virtual java necesita leer el código de la clase MiObjeto antes de crear la primera instancia. Si no se pone la medida no será precisa.
Resumen del capítulo I:
- Tener cuidado con el uso de memoria. Usar la justa.
- Utilizar los métodos freeMemory() y totalMemory() para saber el estado actual de la memoria Ram.
Espero que lo hayáis encontrado interesante. En breve más
Post relacionados:
- Optimizando aplicaciones J2ME (II) – Creación de objetos El otro día empecé unos capítulos de optimización de aplicaciones...
- Memoria Ram y Flash de los módems TC65 y XT65 Últimamente me han preguntado bastante en relación a la memoria...
- Compresión de archivos con J2ME en módems GPRS Siemens TC65 En muchas aplicaciones con módems GPRS es necesario almacenar datos...
- Usar un ofuscador con j2ME. Proguard. Hoy voy a poner un pequeño post sobre Proguard, un...
Etiquetas: j2me, java
Buenas BlogElectronica.
Una pregunta directa corta y rapida sobre el XT65 en cuanto a limitaciones de memoria. ¿Tiene el XT65 limite de tamaño de objetos? Programando para moviles encontre de forma frecuente que el tamaño de objeto no estaba limitado por la memoria libre, sino que estaba predefinido a un tamaño maximo, y aunque hubiera mas memoria libre si lo hacia crecer mas provocaba una excepción.
Genial el blog, geniales las respuestas.
Jose Escobar
Hola,
En mi experiencia, la única limitación que yo he encontrado está en tener un bloque de memoria no fragmentado de al menos 60K para que la JVM no se pare
Salu2
Pua
Hola,
He estado mirando en mi Eclipse
Preferences/Java/Debug/Warn when unable to install breakpoints due to missing line number attributes
A eso le pones un tick
Debajo de esto tienes Comunication con dos opciones DEbugger Timeouts(ms) y Launch timeout(ms) . Usa 1 minutos para ambos (60000)
Salu2
Pua
Hola,
Alguien podria recomendar algun buen libro de J2ME para comenzar mi propia aplicacion con el modulo MTX65.. Soy novato en Java y tanta informacion en la red me satura
Gracias.