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

javaw.exe crece indefinidamente

Estas en el tema de javaw.exe crece indefinidamente en el foro de Java en Foros del Web. Hola, amigos javeros. Tengo un problema al correr mi aplicación desde NetBeans. Estoy haciendo pruebas de tiempos de consulta a una BD. El problema que ...
  #1 (permalink)  
Antiguo 20/01/2011, 11:03
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 13 años, 5 meses
Puntos: 3
Exclamación javaw.exe crece indefinidamente

Hola, amigos javeros.

Tengo un problema al correr mi aplicación desde NetBeans. Estoy haciendo pruebas de tiempos de consulta a una BD. El problema que tengo es que en un momento dado, realizo un query que me trae de la BD unos 200.000 registros. Inicialmente, el Administrador de Tareas de Windows me informa que el proceso javaw.exe tiene un tamaño aproximado de 50 MB. Cuando ejecuto este query, me trae a memoria 200.000 objetos y javaw.exe crece a 300 MB. Luego cargo estos 200.00 objetos en un Jtable. Logré asignarle más memoria para ver cuánta me consume este query y javaw.exe crece a un máximo aproximado de 600 MB.
Por otro lado, este query se encuentra dentro de un hilo. Y por si sirve de algo esta información, estoy usando un JFrame para la pantalla principal del programa y luego en un JDesktopPanel voy agregando los JInternalFrame, que son las ventanas que utiliza el usuario para cargar, modificar o eliminar registros de la BD. En este caso son Bienes de Uso (Muebles e Inmuebles: instalaciones, maquinarias, servicios, obras, etc.).
Pero luego de usarlo y finalizar todos los objetos, éstos siguen presentes en memoria, es decir, no se liberan. He buscado por muchos foros y aparentemente es un problema común. Y la mayoría proponen soluciones tales como llamar al Garbage Collector luego de desreferenciar a los objetos. Lo he intentado de varias formas, pero la memoria sigue sin liberarse. Y a medida que voy haciendo consultas y listados, el proceso javaw.exe sigue creciendo indefinidamente. Por lo tanto en un momento dado me va a dar un Error de Java heap.
No se si el problema estará en:
- el tratamiento del hilo,
- la forma de realizar el query,
- la forma de liberar de memoria,
- la forma de correr el GC,
- o en algún otro lugar que no me llego a dar cuenta.
A continuación les agrego mi código para que lo vean y por favor me digan qué es lo que estoy haciendo mal o qué es lo que me falta.

Código Javascript:
Ver original
  1. class agregarATabla extends Thread {
  2.  
  3.         public void run() {
  4.             traerDatos();
  5.         }
  6.  
  7.         private void traerDatos(){
  8.             Session sesion = HibernateUtil.currentSession(Fuentes.Main.lugarDeAcceso); //Abro la sesión
  9.             Query query = sesion.createQuery("from Bienes where codigo between :descod and :hascod " +
  10.                                              "and nombre between :desnom and :hasnom " +
  11.                                              "and seccion between :dessec and :hassec " +
  12.                                              "and localizacion between :desloc and :hasloc " +
  13.                                              "and rubro between :desrub and :hasrub " +
  14.                                              "and fechaalta between :desalta and :hasalta order by codigo");
  15.             // Seteo los filtros del query:
  16.             query.setParameter("descod", Integer.parseInt(codigoDe));
  17.             query.setParameter("hascod", Integer.parseInt(codigoHa));
  18.             query.setParameter("desnom", nombreDe);
  19.             query.setParameter("hasnom", nombreHa);
  20.             query.setParameter("dessec", Integer.parseInt(seccionDe));
  21.             query.setParameter("hassec", Integer.parseInt(seccionHa));
  22.             query.setParameter("desloc", Integer.parseInt(localizacionDe));
  23.             query.setParameter("hasloc", Integer.parseInt(localizacionHa));
  24.             query.setParameter("desrub", Integer.parseInt(rubroDe));
  25.             query.setParameter("hasrub", Integer.parseInt(rubroHa));
  26.             query.setParameter("desalta", fechaDe);
  27.             query.setParameter("hasalta", fechaHa);
  28.             List<Entidades.Bienes> list = null;
  29.             boolean error = false;
  30.             // Ejecuto el query:
  31.             try {
  32.                 list = query.list();
  33.             } catch (Error bounded) { // Lanzo un mensaje si no queda más memoria libre:
  34.                 error = true;
  35.                 HibernateUtil.closeSession(Fuentes.Main.lugarDeAcceso); // Cierro la sesión
  36.                 funcionesPersonalizadas.mostrarError(padre, "La consulta arrojó muchos resultados.\n" +
  37.                         "Esto puede generar un comportamiento inestable.\n" +
  38.                         "Por favor, seleccione rangos más acotados para reducir la consulta.");
  39.                 dispose();
  40.             }
  41.             if (!error) {
  42.                 Object[] dat = {null, null, null, null, null, null, null};
  43.                 double monto = 0.00;
  44.                 double contenido = 0.00;
  45.                 TableColumnModel m = tbl_filtros.getColumnModel();
  46.                 // Las 2 siguientes líneas son para establecer el formato de fecha
  47.                 // y decimal en las columnas 5 y 6 respectivamente.
  48.                 m.getColumn(5).setCellRenderer(new DateCellRenderer());
  49.                 m.getColumn(6).setCellRenderer(new DecimalCellRenderer());
  50.                 for (Entidades.Bienes b : list){
  51.                     dat[0] = b.getCodigo();
  52.                     dat[1] = b.getNombre();
  53.                     dat[2] = b.getSecciones().getNombre();
  54.                     dat[3] = b.getLocalizaciones().getNombre();
  55.                     dat[4] = b.getRubros().getNombre();
  56.                     dat[5] = b.getFechaalta();
  57.                     contenido = Double.parseDouble(b.getValororigen().toString());
  58.                     dat[6] = contenido;
  59.                     modelo.addRow(dat);
  60.                     monto = monto + contenido;
  61.                 }
  62.                 list.clear(); // Limpio la lista que contiene los resultados del query
  63.                               // para que el GC libere la memoria
  64.                 HibernateUtil.closeSession(Fuentes.Main.lugarDeAcceso); // Cierro la sesión
  65.                 fld_Total.setNumero(String.valueOf(funcionesPersonalizadas.redondear(monto + contenido, 2)));
  66.                 lbl_CargaDatos.setVisible(false);
  67.                 if (tbl_filtros.getRowCount() == 0)
  68.                     funcionesPersonalizadas.mostrarInformacion(padre, "No hay datos en los rangos solicitados");
  69.             }
  70.             tbl_filtros.removeAll(); // Vacío la tabla que tenía los datos.
  71.             // No se si las siguientes 2 líneas se usan así, pero no me funciona.
  72.             System.runFinalization();
  73.             System.gc();
  74.             this.stop();
  75.         }
  76.     }

Luego de ejecutar el GC, la memoria asignada al proceso javaw.exe no disminuye (de hecho no disminuye NUNCA, sino que crece indefinidamente). Por lo tanto creo que en algún punto estoy haciendo algo mal.
Por favor, necesito ayuda urgente con este problema. Desde ya muchas gracias a todos !!!

Etiquetas: Ninguno
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 22:23.