Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Uso excesivo de memoria ram

Estas en el tema de Uso excesivo de memoria ram en el foro de Java en Foros del Web. Buenas tardes: Cuando arranco el programa que he hecho en java, este no para de incrementar el consumo de memoria ram, sube a 500 mb ...
  #1 (permalink)  
Antiguo 25/10/2013, 10:57
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Uso excesivo de memoria ram

Buenas tardes:

Cuando arranco el programa que he hecho en java, este no para de incrementar el consumo de memoria ram, sube a 500 mb en apenas 5 minutos. El recolector de basura no hace su trabajo.

Me gustaría saber si hay alguna función especial que borre todas las referencias a objetos para hacer un "reset" de la memoria ram por un lado.

Y por otro alguna forma de guardar los datos de las variables que me interesan a un documento fijo del que recoger y editar los valores.

Un saludo y gracias anticipadas.
  #2 (permalink)  
Antiguo 25/10/2013, 11:03
JMitsu
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Uso excesivo de memoria ram

Quizás estés teniendo una fuga de memoria. Tienes que revisar bien tus algoritmos, que no estés creando objetos de más. El recolector de Java es muy eficiente, así que creo que sea problema de él.
  #3 (permalink)  
Antiguo 25/10/2013, 14:02
 
Fecha de Ingreso: noviembre-2012
Mensajes: 40
Antigüedad: 12 años
Puntos: 7
Respuesta: Uso excesivo de memoria ram

El recolector de basura hace bien su trabajo, y hay que saber cómo trabaja para poder juzgarlo correctamente y sobre todo cuando tienes un problema de memoria es muy probable que el problema sea el código que ejecutas.

Péganos aquí el fragmento que te da problemas y te intentaremos ayudar.
  #4 (permalink)  
Antiguo 25/10/2013, 15:23
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Gracias por las respuestas.

Estos son los errores que se producen:

Código:
java.lang.OutOfMemoryError: Java heap space
	at ddf.minim.javasound.JSBaseAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSPCMAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSBufferedSampleRecorder.save(Unknown Source)
	at ddf.minim.AudioRecorder.save(Unknown Source)
	at com.getflourish.stt.STT.startListening(STT.java:435)
	at com.getflourish.stt.STT.handleAuto(STT.java:314)
	at com.getflourish.stt.STT.draw(STT.java:194)
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1159)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1152)
	at processing.core.PApplet.handleMethods(PApplet.java:1346)
	at processing.core.PApplet.handleDraw(PApplet.java:2320)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
	at processing.core.PApplet.run(PApplet.java:2176)
	at java.lang.Thread.run(Thread.java:662)
java.lang.OutOfMemoryError: Java heap space
	at ddf.minim.javasound.JSBaseAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSPCMAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSBufferedSampleRecorder.save(Unknown Source)
	at ddf.minim.AudioRecorder.save(Unknown Source)
	at com.getflourish.stt.STT.startListening(STT.java:435)
	at com.getflourish.stt.STT.handleAuto(STT.java:314)
	at com.getflourish.stt.STT.draw(STT.java:194)
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1159)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1152)
	at processing.core.PApplet.handleMethods(PApplet.java:1346)
	at processing.core.PApplet.handleDraw(PApplet.java:2320)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
	at processing.core.PApplet.run(PApplet.java:2176)
	at java.lang.Thread.run(Thread.java:662)
?
java.lang.OutOfMemoryError: Java heap space
	at ddf.minim.javasound.JSBaseAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSPCMAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSBufferedSampleRecorder.save(Unknown Source)
	at ddf.minim.AudioRecorder.save(Unknown Source)
	at com.getflourish.stt.STT.startListening(STT.java:435)
	at com.getflourish.stt.STT.handleAuto(STT.java:314)
	at com.getflourish.stt.STT.draw(STT.java:194)
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1159)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1152)
	at processing.core.PApplet.handleMethods(PApplet.java:1346)
	at processing.core.PApplet.handleDraw(PApplet.java:2320)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
	at processing.core.PApplet.run(PApplet.java:2176)
	at java.lang.Thread.run(Thread.java:662)
java.lang.OutOfMemoryError: Java heap space
	at ddf.minim.javasound.JSBaseAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSPCMAudioRecordingStream.<init>(Unknown Source)
	at ddf.minim.javasound.JSBufferedSampleRecorder.save(Unknown Source)
	at ddf.minim.AudioRecorder.save(Unknown Source)
	at com.getflourish.stt.STT.startListening(STT.java:435)
	at com.getflourish.stt.STT.handleAuto(STT.java:314)
	at com.getflourish.stt.STT.draw(STT.java:194)
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1159)
	at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1152)
	at processing.core.PApplet.handleMethods(PApplet.java:1346)
	at processing.core.PApplet.handleDraw(PApplet.java:2320)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
	at processing.core.PApplet.run(PApplet.java:2176)
	at java.lang.Thread.run(Thread.java:662)
?
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
?
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
?

EL código es demasiado extenso, aún así voy a intentar editarlo y colgarlo.

Un saludo
  #5 (permalink)  
Antiguo 25/10/2013, 17:30
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Cita:
Iniciado por MarronsDispatcher Ver Mensaje
Péganos aquí el fragmento que te da problemas y te intentaremos ayudar.
Aquí pego todo el código, desconozco que parte es la que da los problemas:

Parte 1:

Código:
import processing.serial.*;
import com.getflourish.stt.*;
import ddf.minim.*;
import javax.sound.sampled.*;
STT stt;
String result="home";;
Minim minim;
AudioPlayer sonido;


PImage img;
Serial myPort;  // The serial port
  int reproductor = 0;
  int reproducir = 0;
  int val;
  int entradax;
  int ases = 0;
  int xxxxxxxxxxxm1 = 0;
  int xxxxxxxxxxxm2 = 0;
  int contador1 = 0;
  int i = 0;
  int i2 = 0;
  int valor2 = 1;
  int posicion =0;
  int valorcodigo = 0;
  int testigo = 0; 
  int datosa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; //_m1 indica datos de la ases 1
  int datosb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosaa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //_m1 indica datos de la ases 1
  int datosbb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datoscc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosdd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int valor = 0;
  int valorr = 0;
  int valordato = 0;
  int posiciony = 15;
  int controlenvio = 0;
  String listado1[]={"0", "Perro", "Gato", "conejo", "Hola", "Cerdo", "Frun", "Fuego", "Agua", "Trabajo", "Buenos dias", "Calamidad", "Escudo", "Espada", "Minero", "Leñador", "Aldeano", "Caballero", "Tio", "Abuelo", "Aguador", "Herrero", "Pepeton", "Gastar", "Mañana", "Tarde", "Entrenar", "Salon", "Patio", "Cuadra", "Pantalon", "Mojar", "Estraer", "...", "Caracol", "Europa", "Africa", "Sala", "38"};
  int tiempossonidos[]= {0, 1200, 1600, 1000, 1250, 1000, 1250, 1350, 1200, 1200, 1250, 1100, 1150, 1050, 1100, 1290, 1400, 1800, 1400, 1250, 1200, 1100, 1280, 1000, 650, 1000, 1100, 1800, 1900, 2000, 1900, 1200, 1200, 700};
  int tiemposjjjjs[]={500, 500, 500, 500, 500, 500, 700, 650, 500, 600};
  long previousMillis = 0;
long milliss = 0;
long puertoactivo = 0;
int controltiempo=0;
int cambio =0;
int tiempo = 0;
int puntero = -1;
int controlr = 0;
int rtodo = 0;
void setup() {
  

  // List all the available serial ports
  println(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[0], 9600);
  img = loadImage("asessProcessing.jpg");
  size(878, 439);
  minim = new Minim(this);
stt = new STT(this);
  stt.enableDebug();
  stt.setLanguage("es"); 
   stt.enableAutoRecord();
}

void draw() 
{
  // Expand array size to the number of bytes you expect
  image(img, 0, 0);
  byte[] inBuffer;

if ((millis()-puertoactivo)>12000) 
{
  
  puertoactivo = millis();
  sonido = minim.loadFile("puerto desconectado" + ".mp3");
  sonido.play();
  
}



 while (myPort.available() > 0) {
    char inByte = myPort.readChar();
    
    valordato = Character.digit(inByte, 10);
    
    
     if (inByte == '?') 
{
  puertoactivo = millis();
  inByte = 'a';
}
    
    
 
 if (inByte == '$') 
{
  contador1++;
  inByte = 'a';
  valorcodigo = 0;
  
  i=0;

}

if (contador1 == 1 && inByte != 'a') 
{
  ases= Character.digit(inByte, 10);
  
  controlenvio = 1;
  inByte = 'a';
  
    if (ases == 1) 
{
  resetases1();
}   

    if (ases == 2) 
{
  resetases2();
}    
 
}



  if (ases == 1) 
{
  
if (contador1 == 2 && inByte != 'a') 
{
  xxxxxxxxxxxm1 = Character.digit(inByte, 10);
 
  inByte = 'a';
}    
  
if (contador1 == 3 && inByte != 'a') 
{ 
   if (inByte == '/') 
{
 
  testigo = 1; 

  inByte = 'a';
}

  
  if (testigo == 0) 
{

  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  inByte = 'a';
 
 } 
  if (testigo == 1) 
{
   datosa[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}  


if (contador1 == 4 && inByte != 'a') 
{ 
  
 if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}


  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datosb[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}
  
  
if (contador1 == 5 && inByte != 'a') 
{ 
 
  if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}
 
  
  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datosc[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}  


if (contador1 == 6 && inByte != 'a') 
{ 
 
  if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}
  
  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datosd[i] = valorcodigo;
   i++;
   testigo = 0;
   valorcodigo = 0;
   inByte = 'a';
 }
  
}  
  
  if (contador1 == 7) 
{ 
  contador1 = 0;
  testigo = 0;
  inByte = 'a';
  controlenvio = 0;
  reproductor = 1;


 } 
}

  if (ases == 2) 
{
  
if (contador1 == 2 && inByte != 'a') 
{
  xxxxxxxxxxxm2 = Character.digit(inByte, 10);
  
  inByte = 'a';
}    
  
if (contador1 == 3 && inByte != 'a') 
{ 
  
 
 
   if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}

  
  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  inByte = 'a';
 
 } 
  if (testigo == 1) 
{
   datosaa[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}  


if (contador1 == 4 && inByte != 'a') 
{ 
  
 if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}


  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datosbb[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}
  
  
if (contador1 == 5 && inByte != 'a') 
{ 
 
  if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}
 
  
  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datoscc[i] = valorcodigo;
   i++;
   valorcodigo = 0;
   testigo = 0;
   inByte = 'a';
 }
  
}  


if (contador1 == 6 && inByte != 'a') 
{ 
 
  if (inByte == '/') 
{
 
  testigo = 1; 
  inByte = 'a';
}
  
  if (testigo == 0) 
{
  valordato = Character.digit(inByte, 10);
  valorcodigo = (valorcodigo*10)+valordato;
  
  inByte = 'a';
 } 
  if (testigo == 1) 
{
   datosdd[i] = valorcodigo;
   i++;
   testigo = 0;
   valorcodigo = 0;
   inByte = 'a';
 }
  
}  
  
  if (contador1 == 7) 
{ 
  contador1 = 0;
  testigo = 0;
  inByte = 'a';
  controlenvio = 0;
  reproductor = 1;

 }
}
}

  if (mouseX>150 && mouseX<300 && mouseY>25 && mouseY<125 && controlenvio == 0 && reproductor == 0) 
  {  
    fill(80, 162, 193);
    textSize(18);
    text("ases 1", 10, 15);
    text("Mxxxx pxxxxixxs: " + xxxxxxxxxxxm1, 10, 35);
    text("Pxxxxs pxxxs: ", 10, 60); 
    posiciony=posiciony+10;
    
    valor = datosb[i];
    while (valor!=0) 
  {  
    int valorr = datosa[i];
    text(listado1[valorr] + ". Cxxxxxd: " + datosb[i], 10, 55+posiciony);
    i++;
    posiciony=posiciony+15;
    valor = datosb[i];
  } 

     if (valor==0) 
  {  
     i=0;
    posiciony=posiciony+10;
     text("Sxxxxx pxxxx: ", 10, 55+posiciony);
     posiciony=posiciony+20;
     
     valor = datosd[i];
      while (valor!=0) 
  {  
    int valorr = datosc[i];
    text(listado1[valorr] + ". Cxxxxxxd: " + datosd[i], 10, 55+posiciony);
    i++;
    posiciony=posiciony+15;
    valor = datosd[i];
  } 
  
     i=0;
     posiciony=15;
  }  
 
  } 

if (mouseX>550 && mouseX<700 && mouseY>25 && mouseY<125 && controlenvio == 0 && reproductor == 0)
  {  
    fill(80, 162, 193);
    textSize(18);
    text("ases 2", 400, 15);
    text("Mxxxxs pxxxs: " + xxxxxxxxxxxm2, 400, 35);
    text("Pxxxxs pxxxxs: ", 400, 60); 
    posiciony=posiciony+10;
    
    valor = datosbb[i];
    while (valor!=0) 
  {  
    int valorr = datosaa[i];
    text(listado1[valorr] + ". Cxxxxxd: " + datosbb[i], 400, 55+posiciony);
    i++;
    posiciony=posiciony+15;
    valor = datosbb[i];
  } 

     if (valor==0) 
  {  
     i=0;
    posiciony=posiciony+10;
     text("Sxxxs pxxxs: ", 400, 55+posiciony);
     posiciony=posiciony+20;
     
     valor = datosdd[i];
      while (valor!=0) 
  {  
    int valorr = datoscc[i];
    text(listado1[valorr] + ". Cxxxxxd: " + datosdd[i], 400, 55+posiciony);
    i++;
    posiciony=posiciony+15;
    valor = datosdd[i];
  } 
  
     i=0;
     posiciony=15;
 
  }   
  } /// final de mouse
  
  
  
  if (rtodo != 0 && reproductor == 0)
  { 
   
   i=0;
   reproductor =1;
   ases =rtodo;
   rtodo++;
   
   
   sonido = minim.loadFile("señalescucha" + ".mp3");
    sonido.play();
   
   
   if (rtodo > 2) // 2 = jjjj totalde asess 
  {
   rtodo=0; 
  }
  }
  
  
    
  if (reproductor == 1 && controlenvio == 0)
  { 
    
    
    if (controltiempo == 0)
  {
    previousMillis = millis();
    controltiempo =1;
    }
     
     if (controltiempo == 1)
  {
    if (millis()- previousMillis > tiempo)
  {
    cambio = 1;
    controltiempo = 0;
    puntero++;
    tiempo =5000000;
   }
      controltiempo =1;
    }

Salu2s
  #6 (permalink)  
Antiguo 25/10/2013, 17:30
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Parte 2:

Código:
     if (cambio == 1)
  {
    if (puntero == 0)
  {
    sonido = minim.loadFile("xxo pxxxxx xe xx ases nxxxo" + ".mp3");
    tiempo = 2500;
   
   }
   
    if (puntero == 1)
  {
    sonido = minim.loadFile("jjjj " + ases + ".mp3");
    tiempo = tiemposjjjjs[ases];
   
   }
    
    if (puntero == 2)
  {
    sonido = minim.loadFile("xxx xe xxxxs sxxx.mp3");
    tiempo = 2000;
   
   }
   
    if (puntero == 3)
  {
    int nxxxxxx =0;
    
     if (ases == 1)
  {
   nxxxxxx = xxxxxxxxxxxm1; 
   }
   
    if (ases == 2)
  {
   nxxxxxx = xxxxxxxxxxxm2; 
   }
        
    sonido = minim.loadFile("nuxxx " +nxxxxxx+".mp3");
    tiempo = tiemposjjjjs[nxxxxxx];
     
   }
   
   
   
   
   if (ases == 1)
  {
    if (puntero == 4)
  {
    sonido = minim.loadFile("pxxxxxxx sxxxxxxos.mp3");
    tiempo = 2000;
     
   } 
   
   if (puntero == 5)
  {
    
   if (datosa[i]!=0)
  {
    sonido = minim.loadFile(listado1[datosa[i]]+".mp3");
    tiempo = tiempossonidos[datosa[i]];
       
   }
   else
    {
    puntero =8;
    i=0;
    }
   } 
   
   if (puntero == 6)
  {
    sonido = minim.loadFile("xxxxxxxx.mp3");
    tiempo = 1250;
      
  } 
  
  if (puntero == 7)
  {
    sonido = minim.loadFile("xxx " + datosb[i]+".mp3");
    tiempo = tiemposjjjjs[datosb[i]];
     
   puntero =4; 
   i++;
  }
  
  
  if (puntero == 8)
  {
    
   if (datosc[i]!=0)
  {
    sonido = minim.loadFile(listado1[datosc[i]]+".mp3");
    tiempo = tiempossonidos[datosc[i]];    
   }
   if (datosc[i]==0)
    {
    puntero = 11;
    i=0;
    }
   } 
   
   if (puntero == 9)
  {
    sonido = minim.loadFile("jjjj de xxxx.mp3");
    tiempo = 1250;
      
  } 
  
  if (puntero == 10)
  {
    sonido = minim.loadFile("jjjj " + datosd[i]+".mp3");
    tiempo = tiemposjjjjs[datosd[i]];
     
   puntero =7;
  i++; 
  }
   }
  
  if (ases == 2)
  {
    if (puntero == 4)
  {
    sonido = minim.loadFile("xxxxxxxxxxxx.mp3");
    tiempo = 2000;
     
   } 
   
   if (puntero == 5)
  {
    
   if (datosaa[i]!=0)
  {
    sonido = minim.loadFile(listado1[datosaa[i]]+".mp3");
    tiempo = tiempossonidos[datosaa[i]];
       
   }
   else
    {
    puntero =8;
    i=0;
    }
   } 
   
   if (puntero == 6)
  {
    sonido = minim.loadFile("xxxxs.mp3");
    tiempo = 1250;
      
  } 
  
  if (puntero == 7)
  {
    sonido = minim.loadFile("jjjj " + datosbb[i]+".mp3");
    tiempo = tiemposjjjjs[datosbb[i]];
     
   puntero =4; 
   i++;
  }
  
  
  if (puntero == 8)
  {
    
   if (datoscc[i]!=0)
  {
    sonido = minim.loadFile(listado1[datoscc[i]]+".mp3");
    tiempo = tiempossonidos[datoscc[i]];    
   }
   if (datoscc[i]==0)
    {
    puntero = 11;
    i=0;
    }
   } 
   
   if (puntero == 9)
  {
    sonido = minim.loadFile("xxxxxxxxxxxxxxx.mp3");
    tiempo = 1250;
      
  } 
  
  if (puntero == 10)
  {
    sonido = minim.loadFile("jjjj " + datosdd[i]+".mp3");
    tiempo = tiemposjjjjs[datosdd[i]];
     
   puntero =7;
  i++; 
  }
   }
  
  
if (puntero == 11)
  {
    reproductor=0; 
    controltiempo = 0;
    cambio = 0;
    puntero = -1;
    
    i = 0;
    tiempo = 10;
  }

    previousMillis = millis();  
    sonido.play();
    cambio = 0;
    
   }
    }  
  } //final de void draw
  
  
void resetases1()
  {
    
i=0;

while (i < 9) 
  {
    
   datosa[i] = 0; //_m1 indica datos de la ases 1
   i++;
  }
   i=0;
   while (i < 9 ) 
  {
    datosb[i] = 0;
    i++;
  } 
  i=0;
   while (i < 9 ) 
  {
    datosc[i] = 0;
    i++;
  }  
  i=0;
    
    while (i < 9 ) 
  {
    datosd[i] = 0;
    i++;
  } 
  i=0;
    }


void resetases2()
  {
    
i=0;

while (i < 9) 
  {
    
   datosaa[i] = 0; //_m2 indica datos de la ases 1
   i++;
  }
   i=0;
   while (i < 9 ) 
  {
    datosbb[i] = 0;
    i++;
  } 
  i=0;
   while (i < 9 ) 
  {
    datoscc[i] = 0;
    i++;
  }  
  i=0;
    
    while (i < 9 ) 
  {
    datosdd[i] = 0;
    i++;
  } 
  i=0;
    }


void transcribe (String utterance, float confidence) 
{

  result = utterance;
  traductor ();
}

void traductor ()
{
 if(result.equalsIgnoreCase("reproducir") || reproducir == 1)
  {
    if (reproducir==0)
    {
      i=0;
    sonido = minim.loadFile("señalescucha" + ".mp3");
    sonido.play();
    }
  reproducir = 1;
  if(result.equalsIgnoreCase("todo"))
  {
    rtodo = 1;
    controlr = 0;
    reproducir = 0;
  }
  
   if(result.equalsIgnoreCase("ases 1") || result.equalsIgnoreCase("ases 2") || result.equalsIgnoreCase("ases 3") || result.equalsIgnoreCase("ases 4") || result.equalsIgnoreCase("ases 5") || result.equalsIgnoreCase("ases 6") || result.equalsIgnoreCase("ases 7") || result.equalsIgnoreCase("ases 8") || result.equalsIgnoreCase("ases 9") )
{
   char inByte = result.charAt(5);
 ases = Character.digit(inByte, 10);
 inByte = 'a';
 
  contador1 = 0;
  testigo = 0;
  controlenvio = 0;
  reproductor = 1;
  
  
  controlr = 0;
  reproducir = 0;

}
  
  if(result.equalsIgnoreCase("ases") || controlr == 1)
{
  if (controlr==0)
    {
    sonido = minim.loadFile("señalescucha" + ".mp3");
    sonido.play();
    }
   controlr =1;
 if(result.equalsIgnoreCase("1") || result.equalsIgnoreCase("2") || result.equalsIgnoreCase("3") || result.equalsIgnoreCase("4") || result.equalsIgnoreCase("5") || result.equalsIgnoreCase("6") || result.equalsIgnoreCase("7") || result.equalsIgnoreCase("8") || result.equalsIgnoreCase("9") )
{
   char inByte = result.charAt(0);
 ases = Character.digit(inByte, 10);
 inByte = 'a';
 
  contador1 = 0;
  testigo = 0;
  controlenvio = 0;
  reproductor = 1;
  
  
  controlr = 0;
  reproducir = 0;

}
 
}

  if(ases==11)
{
 
}
  }
}

void stop()
{
  sonido.close();
  minim.stop();
 
  super.stop();
}

Un saludo y perdonar el ladrillaco
  #7 (permalink)  
Antiguo 26/10/2013, 03:39
 
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.
  #8 (permalink)  
Antiguo 26/10/2013, 09:10
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Buenas tardes, muchísimas gracias por la ayuda MarronsDispatcher.

El código se encarga de recoger los datos que le llegan desde arduino y almacenarlos en su apartado correspondiente. Las únicas variables que interesan mantener del código son estas:
int datosa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosaa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosbb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int datoscc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int datosdd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

El resto de objetos y cosas que saturan la memoria se utilizan para reproducir en forma de texto o sonido los datos.

Otro apartado se encarga de reconocer la voz para volver a reproducir de forma sonora los datos.

Lo que más memoria ram consume es la carga y reproducción de sonidos:

Código:
sonido = minim.loadFile("xxo pxxxxx xe xx ases nxxxo" + ".mp3");
sonido.play();
El consumo es de unos 20-30 megas por oleada de datos.

No se como puedo hacer para que el recolector de basura lo elimine una vez reproducido. Es como si la referencia permaneciese aunque a continuación cargue otro sonido:

Código:
sonido = minim.loadFile("Nasiopalaalegria" + ".mp3");
sonido.play();


Lo que realmente quería hacer es programar reseteos automáticos del programa cada cierto tiempo y recuperar los valores de una base de datos.

Código:
int datosa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; 
  int datosb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosaa[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
  int datosbb[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datoscc[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int datosdd[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Aunque parezca mentira el programa hace lo que tiene que hacer sin aparentemente más fallos que el apetito voraz de memoria ram.

_________

He estado testeando las diferentes aplicaciones que ido haciendo y el reconocedor de voz genera un consumo de ram de 0,5mb/s

Aparentemente la recepción de datos aunque experimenta un incremento de ram inicial de unos 2-5mb finalmente se estabiliza y el programa se queda consumiendo simplemente 35 mb.

Intente arreglarlo poniendo
Código:
sonido = null;
pero no sirvió de nada.
  #9 (permalink)  
Antiguo 26/10/2013, 09:18
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Si utterance es nula la biblioteca no llama a transcribe y result no es nula. Creo que por eso no me da fallos, aún así lo cambiaré ;)

Hace apenas 2 meses que programo java por mi cuenta, no he recibido formación al respecto, de ahí mi bajo nivel y mis posiblemente absurdas dudas.

Un saludo y gracias por la ayuda ;)

Última edición por anthony20; 28/10/2013 a las 05:52
  #10 (permalink)  
Antiguo 28/10/2013, 06:01
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Buenos días,

Este es el código que genera los problemas en mi programa:

Código:
import com.getflourish.stt.*;
import ddf.minim.*;
STT stt;
void setup() {
stt = new STT(this);
  stt.enableDebug();
  stt.setLanguage("es"); 
   stt.enableAutoRecord();
}
void draw() 
{}
He probado a declarar la variable stt en una función if para que al salir de ella se anule y tampoco ha servido.

Creo que el problema se encuentra en la generación interna de la librería de una variable tipo minim. El problema es que al desconocer la variable, resulta imposible eliminar su referencia.

He intentado acceder al código de la librería, pero el editor de texto no me sirve para realizar una lectura adecuada...

¿Algún experto sabe como se puede solucionar este problema?

pd: he conseguido crear una base de datos con los datos importantes para rescatarlos si el programa se cierra por saturación de RAM. Si alguien sabe como forzar el reinicio automático de un programa java cada cierto tiempo, me seria extremadamente útil para dar una solución parcial al problema con el reconocedor de voz.


Un saludo
  #11 (permalink)  
Antiguo 28/10/2013, 15:42
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Bueno, simplemente comentar que he hablado con Florian Schulz el desarrollador de la librería stt y me ha informado que es un problema de la librería que se encuentra en investigación.

Así que nada, tanto aburriros con mi código, para que al final el problema fuese "externo" y difícilmente solucionable.

Un saludo
  #12 (permalink)  
Antiguo 28/10/2013, 16:37
 
Fecha de Ingreso: noviembre-2012
Mensajes: 40
Antigüedad: 12 años
Puntos: 7
En ese caso prueba aumentar la memoria a la maquina virtual, posiblemente tengas el xmx en 256 MB dale 512 o 1 GB, asi aumentaras la memoria heap entre otras y tal vez sea suficiente.

No es lo mas recomendable, pero si puede ser una medida temporal hasta que se resuelvan los problemas de memoria que te comento el autor de la libreria.

Para asegurarte de que se trata de problemas de la libreria, puedes usar algun profiler, te ayudara a saber donde esta la fuga de memoria. Jmap es una herramienta de la propia maquina virtual de java y es muy sencillito de usar.Sino puedes tirar de cualquier profiler open source.

Saludos.
  #13 (permalink)  
Antiguo 29/10/2013, 10:17
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Uso excesivo de memoria ram

Aumentando la memoria a 1gb el programa aguanta algo más de 20 minutos.

El problema es que no se como entrar y editar la librería, así que aunque encuentre el fallo(creo que se donde esta), no puedo arreglarlo.

Estoy buscando opciones para reiniciar el programa java cada 20 minutos. He aprendido a guardar y cargar la información importante, así que, si lo consigo el programa funcionará "perfectamente".

Parece que es posible:
http://stackoverflow.com/questions/4159802/how-can-i-restart-a-java-application

Otra cosa es que yo sea capaz de hacerlo :P

Un saludo y gracias por la ayuda ;)

Etiquetas: memoria, programa, ram
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:42.