java heap space error

R.I.P.
31 de Mayo del 2006
Contexto:
Tengo una aplicación J2EE con un jboss y lo que hace es lanzar al iniciar la aplicación un session bean a modo de servicio. Este session bean lo que hace es leer de un socket de manera indefinida (con un bucle), para obtener una trama que decodifico y pongo en una clase de intercambio. El código relevante es este:

while (true) {
s.receive(datagramaUDP);
cal = Calendar.getInstance();
hora = formateador.format(cal.getTime());
if (horaAnt.equals(hora)) {
System.out.println("aki pasa algo");
}
horaAnt = hora;
t = prot.decodificar(datagramaUDP.getData(), datagramaUDP.getLength());
datos = t.getValor();
set = datos.keySet();
iter = set.iterator();
prog = progDAO.proximaProgramacion(con); //ESTA ES LA INSTRUCCION, SI LA COMENTO LA MEMORIA NO CRECE NA.
if (prog.getIdProg() != -1) {
//tenemos una proxima programacion
grabarProg = progDAO.empezarProgramacion(prog.getIdProg(), prog.getFecha(), prog.getHoraInicio(), con);
//esto no se ejecuta
if (grabarProg) {
//grabacion programada
grabDAO.nuevaGrabacion(0, con);
listaProgramacion.add(prog);
prog = null;
prog = progDAO.proximaProgramacion(con);
}
//fin no ejecucion
}
//comprobamos si va a acabar alguna programacion activa
acabar = false;
//esto no se ejecuta
for (int i = 0;i < listaProgramacion.size();i++) {
prog2 = listaProgramacion.get(i);
acabar = progDAO.acabarProgramacion(prog2.getIdProg(), prog2.getFecha(), prog2.getHoraFinal(), con);
if (acabar) {
listaProgramacion.remove(prog2);
//programacion de una vez, la borramos
//no se si borrarla, ya que no la tiene en cuenta una vez pasada
/*if (prog2.getTipo() == 3) {
progDAO.borrarProgramacion(prog2.getIdProg(), con);
}*/
prog = null;
prog = progDAO.proximaProgramacion(con);
}
}
//fin no ejecucion
grabacion = listaProgramacion.size() > 0;
orden = lectDAO.obtenerOrden();
while (iter.hasNext()) {
key = iter.next();
lista = datos.get(key);
for (Float dato : lista) {
System.out.println(String.valueOf(key) + " - " + dato + " - " + hora);
}
//esto no se ejecuta
//si hay grabacion introducimos la lectura a la bd
//lo hacemos en un thread, porque sino perderiamos datos
if (grabacion) {
//lectDAO.insertarLectura(orden, (Integer)key, (Float)datos.get(key), con);
for (Float dato : lista) {
lectDAO.insertarLectura(orden, (Integer)key, dato, con);
}
}
//fin no ejecucion
for (Float dato : lista) {
intercambio.introducirDatos((Integer)key, dato);
}
}
//esto no se ejecuta
//si hay grabacion introducimos los datos de la lectura
if (grabacion) {
datosLectDAO.insertarDatosLectura(orden, hora, con);
}
//fin no ejecucion
intercambio.introducirHora(-1, hora);
System.out.println("fin del paquete");
System.out.println("Memoria maxima: " + Runtime.getRuntime().maxMemory());
System.out.println("Memoria total: " + Runtime.getRuntime().totalMemory());
System.out.println("Memoria libre: " + Runtime.getRuntime().freeMemory());
}


He puesto en el código la instrucción que hace crecer la memoria. Si comento esa instrucción la memoria se mantiene, y no experimenta cambios. He puesto el código del bucle completo pero hay trozos que no se ejecutan y está marcado en los comentarios.

GRACIAS, y espero haberme explicado medianamente bien.