Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/10/2013, 03:39
MarronsDispatcher
 
Fecha de Ingreso: noviembre-2012
Mensajes: 40
Antigüedad: 12 años
Puntos: 7
Respuesta: Uso excesivo de memoria ram

Código Java:
Ver original
  1. java.lang.OutOfMemoryError: Java heap space

Esta excepción la lanza la JVM, y especifica que una de las regiones de memoria que gestiona fue consumida, en este caso la memoria HEAP, que es la encargada de alojar los objetos creados, esta memoria es liberada o bien cuando el objeto muere o bien cuando el recolector de basura hace su trabajo.Normalmente antes de lanzarte la excepción OutOfMemoryError, la JVM intenta lanzar el recolector de basura para intentar evitarlo.

Una solución, aunque no es la más óptima es aumentar la memoria de la maquina virtual, esto realmente no soluciona el problema, ya que es tienes un problema con tu código.

Para averiguar en que parte del código puede estar el problema, te recomiendo que quites y añadas funcionalidades a tu código hasta dar con la parte que te provoca el problema, imaginemos que tu código lee un fichero, después de leer hace unas updates en bbdd y finalmente termina sacándonos un informe, puedes ir quitando funcionalidades y ver cuando te da los problemas de memoria y cuando no.

A parte de eso, voy a darte unos consejos sobre el código copiado y como podría ser mejorado.

Tienes como unas 40 variables primitivas declaradas, seguro que puedes agruparlas por funcionalidad y crearte unas cuantas clases, ayudará a que tu código sea mas legible, y sobre todo porque cuando iguales a null los objetos de clase, ayudaras al recolector de basura a eliminarlos de la memoria HEAP.

No he visto en 800 líneas de código ni una excepción capturada, ni una excepción lanzada, las excepciones nos ayudan a afrontar eventos o situaciones inesperadas dándoles el tratamiento necesario para corregir la situación. Tal vez seas estudiante y no halláis trabajado ni con excepciones ni con objetos todavía.

Uso de constantes, importante, sería muy bueno que utilizaras constantes, hay caracteres repetidos innumerables de veces, el día que en vez de comparar con 'a' compares con 'b', tendrás que buscar todas las apariciones de la misma para modificar la comparación, si utilizas constantes, sólo deberás modificar la constante.

Complejidad ciclomática, tu código es totalmente ilegible, la complejidad ciclomática nos permite saber como de legible es un código, te orienta sobre la fiabilidad del mismo, y sobre la complejidad de ser mantenido.


Código Otro:
Ver original
  1. Complejidad Ciclomática Evaluación del Riesgo
  2. 1-10    Programa Simple, sin mucho riesgo
  3. 11-20   Más complejo, riesgo moderado
  4. 21-50   Complejo, Programa de alto riesgo
  5. 50  Programa no testeable, Muy alto riesgo

He calculado la complejidad ciclomática de tu código y es de 86 puntos más o menos, básicamente se podría definir como no testeable, de alto riesgo e ilegible.

Buceemos ahora en el código:

Tenemos lo siguiente :


Código Java:
Ver original
  1. void resetases2() {
  2.  
  3.         this.i = 0;
  4.  
  5.         while (this.i < 9) {
  6.                        this.datosaa[this.i] = 0; // _m2 indica datos de la ases 1
  7.             this.i++;
  8.           }
  9.  
  10.         this.i = 0;
  11.         while (this.i < 9) {
  12.             this.datosbb[this.i] = 0;
  13.             this.i++;
  14.         }
  15.         this.i = 0;
  16.         while (this.i < 9) {
  17.             this.datoscc[this.i] = 0;
  18.             this.i++;
  19.         }
  20.         this.i = 0;
  21.  
  22.         while (this.i < 9) {
  23.             this.datosdd[this.i] = 0;
  24.             this.i++;
  25.         }
  26.         this.i = 0;
  27.     }

Iteras 4 bucles 9 veces y haces exactamente lo mismo en todos ellos, no sería mejor lo siguiente?

Código Java:
Ver original
  1. void resetases2() {
  2.  
  3.     this.i = 0;
  4.  
  5.     while (this.i < 9) {
  6.         this.datosaa[this.i] = 0; // _m2 indica datos de la ases 1
  7.         this.datosbb[this.i] = 0;
  8.         this.datoscc[this.i] = 0;
  9.         this.datosdd[this.i] = 0;
  10.         this.i++;
  11.     }
  12.        
  13. }


Hablemos del equals o equalsIgnoreCase:

Código Java:
Ver original
  1. this.result.equalsIgnoreCase("ases 1")

Esto esta bien, pero en ningún momento tienes en cuenta que la variable result pueda ser nula, si lo fuera te daría NullPointerException, esa excepción la podrías evitar cambiando el orden de la comparación, algo así como :

Código Java:
Ver original
  1. "ases 1".equalsIgnoreCase(this.result)

Ojo con instanciar objetos dentro de los bucles sino es estrictamente necesario.

Hay más cosas que mejorar pero bueno, vete poco a poco mejorando el código y optimizándolo.

Siento no poder ayudarte a ver exactamente donde esta el problema de memoria.

Buena suerte.