Memoria Ram y Flash de los módems TC65 y XT65
Escrito por blogElectronica en 2.DISPOSITIVOS (práctico), 4.PROGRAMACIÓN, Comunic. GSM/GPRSÚltimamente me han preguntado bastante en relación a la memoria RAM de los módulos gprs TC65 y XT65 (y sus correspondientes terminales) así que voy a poner un pequeño artículo en relación a este tema.
Como sabéis el módulo TC65 tiene un total de 400KB de memoria RAM y 1.7MB de memoria FLASH. Es evidente que la memoria flash, FFS (File Flash System, el sistema de archivos) estará en parte ocupada por nuestra aplicación java (es decir, por los ficheros .jad y .jar) y por todos aquellos archivos extra que necesitemos para nuestra aplicación así como los propios archivos generados por nuestra aplicación java, es decir, ficheros con logs, históricos, etc etc …
Bueno … con 1.7MB puedo hacer un programa inmenso y me sobra ¿para qué me voy a perder el tiempo leyendo esto?
Es cierto que puedes hacer programas bastante grandes pero va a depender mucho de cómo los hagas y de las herramientas que estés utilizando. Si no estructuras bien tu programa puedes llegar a tener problemas serios de memoria.
Vaya, no lo entiendo, cuando ejecuto mi aplicación java me sale un “out of memory” y antes me funcionaba, lo único que he hecho es añadir un poco más de código. Mi fichero .jar ocupa unos 150KB y veo que cuanto más grande es mi fichero .jar menos memoria RAM libre me queda libre … ¿Cómo es esto posible? ¿Pero el programa no está en la memoria flash y los 400KB de RAM no son exclusivamente para las variables y datos de mi aplicación?
Evidentemente no. Por supuesto tus ficheros .jar y .jad están tranquilamente en la memoria Flash, sino cuando apagases el módem se borrarían. Pero piensa que el fichero .jar es un fichero comprimido (puedes abrirlo si quieres con el winrar) y dentro están los bytescode, los ficheros .class, los ficheros con código java compilado. El módem va a descomprimir esos archivos y va a cargar los necesarios en memoria RAM. De ahí que cuanto mayor sea tu programa java menos espacio libre te va a quedar en memoria RAM (o no, depende de tu programación).
Si por ejemplo eres de la vieja escuela y pese a permitir el lenguaje java una programación orientada a objetos haces una programación completamente lineal, tipo programación C, es decir, si tu aplicación consiste en un único fichero .java inmenso lleno de métodos (que tú verás como funciones de C) puedes tener serios problemas a medida que tu aplicación crezca. Si trabajas de esa manera, cuando arranques tu aplicación java, todo el código de programa lo vas a tener cargado de forma permanente en memoria RAM y podrás tener problemas serios de memoria a la larga.
La mejor manera de ahorrarse esos problemas consiste en una programación más estructurada, es decir, una programación realmente orientada objetos. Antes de ponerte a escribir código planifica tu aplicación, estructúrala en objetos creando un archivo .java (y por tanto un archivo .class) por cada objeto de tu aplicación. De esta manera cargarás en memoria pequeños archivos .class sólo cuando sean necesarios por tu aplicación, es decir, cuando necesites crear un determinado objeto para realizar algo y destruyéndolo cuando no lo necesites, o lo que es lo mismo, liberando memoria cuando ya no lo necesites. Si haces un programa un único fichero .java inmenso (.class inmenso) tendrás en memoria todo el código de todos los métodos te sean necesarios o no en un momento determinado.
Es demasiado tarde … ya tengo hecha mi aplicación y tengo problemas de memoria. No puedo volver a hacerla toda, tardaría semanas y mi jefe me mataría … ¿Puedo hacer algo?
Estás de suerte, sí (de todas maneras cuando hagas otra aplicación estructúrala mejor). Puedes utilizar un ofuscador java. Un ofuscador, al realizar su misión, es decir, al ofuscar el código compilado, comprime todavía más los archivos .class. De hecho si creas un package mediante un ofuscador verás como el fichero .jar ocupa bastante menos, incluso la mitad. Esto te va a dar cancha para no tener que rehacer la aplicación entera pero te aconsejo una programación más estructurada en un futuro.
¿Y qué ofuscador utilizas?
Personalmente utilizo el de Proguard integrado en el Eclipse. Otro día ya hablaré más de él en otro artículo, por hoy ya está.
Hoy Sábado a ver si acabo un proyecto que tengo pendiente y al que no acabo nunca de darle el remate final, pues últimamente estoy saturado de trabajo. Un pequeño proyecto on-line que he lanzado hace pocos días en el dominio www.PisosDeAlquiler.com, un portal de cruce de ofertas de pisos de alquiler, como su propio nombre indica.
La verdad es que es uno de los mejores nombres de dominio que tengo (y tengo más de un cententar). Un dominio, como digo yo, “gran reserva del 2002″, ya que lo adquirí en aquel año. Realmente durante estos años he estado a punto de venderlo en varias ocasiones, pues he recibido algunas ofertas de compra por él. La última oferta fue de 3.000€ que me hizo dudar bastante, aunque finalmente, y más viendo cómo está el patio de la vivienda en España en el que creo el alquiler va a crecer, me lo quedé. El tiempo dirá si hice bien.
Que paséis un estupendo fin de semana
Post relacionados:
- Uso correcto de la Flash de los módems Cinterion TC65 y XT65 En muchas ocasiones podemos tener la necesidad de utilizar el...
- Localizando fallos difíciles de reproducir en los módems Cinterion TC65, XT65 Si desarrollas aplicaciones en Java para los módems gprs TC65,...
- Ejemplo de FTP Java para módems gprs Cinterion TC65 y XT65 Posiblemente en alguna ocasión tengas que hacer un programita en...
- Compresión de archivos con J2ME en módems GPRS Siemens TC65 En muchas aplicaciones con módems GPRS es necesario almacenar datos...
- Añadir datos a ficheros con módems Siemens-Cinterion desde java En bastantes ocasiones me ha llegado la pregunta de cómo...
Etiquetas: cinterion, j2me, java, tc65, xt65
Cuidado con los ofuscadores y la reflection …
Hola Ernesto,
gracias por el apunte, es verdad.
http://en.wikipedia.org/wiki/Reflection_API#Java
Salu2.
Hola Blogelectronica!
Antes de nada quería felicitarte por el esplendido trabajo que haces en este blog!
Te comento una duda a ver si me puedes orientar:
Necesito almacenar unos parámetros en la memoria flash del tc65 y que se mantengan aunque se apague el equipo. Estos parámetros son contadores, teléfonos autorizados o variables de control que pueden cambiar una vez grabado el .jar.
¿Cómo puedo mantenerlos?¿tengo que crear un archivo para almacenarlos en memoria?
Gracias de antemano.
Un saludo!
PD: no se si este es el lugar mas adecuado para la pregunta.
Hola Victor,
busca en los ejemplos java de este blog.
Ahí tienes como usar los archivos en Flash con el TC65.
http://www.blogelectronica.com/ejemplos-java-j2me-modem-gprs-siemens/
Salu2.
De nuevo, felicitaciones por tu blog precioso.
Una pregunta que tengo sobre el flash: es cierto que esta memoria
tiene un número limitado de lectura / escritura 100.000 veces?
En situaciones que nuestro aplicación JAR hace un registro de varias veces al día puede ser muy problemático.
Me pregunto cuál es su opinión.
Hola Jose, es cierto.
Pero no es cosa de esta memoria, en general una memoria FLASH tiene un límite de 100.000 escrituras.
Pero no te preocupes, obviamente los algoritmos de escritura de los módems Cinterion en memoria FLASH hacen que no se guarden los datos en el mismo lugar, sino que se va distribuyendo equitativamente por toda la memoria flash. Es decir, que en la práctica podrás hacer muchas más escrituras. Lo único que tienes que tener presente, es usar la memoria flash tal y como te indico en este post, NUNCA borrar ficheros de LOG, siempre sobreescribir.
Salu2!
Hola Jose
Oye nuevamente con una duda sobre la flash files system, una vez que me carca el error como puedo liberar el espacio?? por que apago el modulo pero no se libera he notado que si se libera pero pasando mucho tiempo.
Creo saber por que es pero no se como solucionarlo una vez que sale y no esperar mucho para que se libere.
Como le puedo hacer???
hay algún comando que desde la Hyperterminal pueda ejecutar y que se me libere??
Gracias
Hola Abraham,
entiendo que te refieres a la memoria RAM, no FLASH. Para liberar un poco más rápido la memoria RAM puedes pasar más a menudo el garbage collector llamando desde tu programa a System.gc();
Salu2