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

java.lang.OutOfMemoryError: Java heap space

Estas en el tema de java.lang.OutOfMemoryError: Java heap space en el foro de Java en Foros del Web. Me gustaria saber cual es la mejor solucion para mi problema. Tengo un programa en java que se comunica con una base de datos MySQL ...
  #1 (permalink)  
Antiguo 22/02/2007, 10:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 35
Antigüedad: 18 años, 3 meses
Puntos: 0
Mensaje java.lang.OutOfMemoryError: Java heap space

Me gustaria saber cual es la mejor solucion para mi problema. Tengo un programa en java que se comunica con una base de datos MySQL y SQLServer. Una de sus funciones es replicar una tabla de MySQL en una base de datos de SQLServer, pero como esta tabla contiene unos 500.000 registros (cabe destacar que esta tabla crece cada vez mas) me da un error de que JVM no tiene suficiente memoria cuando selecciono todos sus datos. Al ver este error hice una procedimiento que va tomando mas memoria a medida que JVM se queda sin ella el codigo es el siguiente:

public static void flushMemory()
{
//Usamos un vector para almacenar la memoria.
Vector v = new Vector();
int count = 0;
//inicialmente incrementamos en bloques de 1 megabyte
int size = 60048576;
//Continuaremos hasta que pediremos bloques de
//1 byte
while(size > 1)
{
try
{
for (; true ; count++)
{
//pedir y almacenar más memoria
v.addElement( new byte[size] );
}
}
//Si encontramos un OutOfMemoryError, seguimos
//intentando obtener más memoria, pero en bloques de
//la mitad de tamaño.
catch (OutOfMemoryError bounded)
{
size = size/2;
}
}
//Ahora liberamos todo para el GC
v = null;
//y pedimos un nuevo Vector como un pequeño objeto
//para asegurarnos que se lanza la recolección de basura
//antes de salir del método.
v = new Vector();
}

y el procedimiento que lo llama

try
{
while (resultado==null)
{
try
{
sentencia = conexion.createStatement();
resultado = sentencia.executeQuery(query);
}
catch(OutOfMemoryError e)
{
System.out.println("Se quedo sin memoria "+e);
flushMemory();
resultado = null;
}
}
return resultado;
}
catch(SQLException e)
{
System.out.println("Error al realizar la consulta "+e);
return resultado;
}
con esto igualmente no logro hacerlo funcionar.
Mi pregunta es si la unica solucion (y la mejor) es varios select para luego hacer los insert de esos select.
  #2 (permalink)  
Antiguo 22/02/2007, 12:23
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Re: java.lang.OutOfMemoryError: Java heap space

Hola:

El ResultSet no trae todos los elementos de golpe. Según los vas pidiendo los va trayendo. Una opción es extraer un elemento (o un grupo de ellos adecuado), hacer el insert y eliminarlos de memoria. Luego otro grupo, etc, etc.

Otra opción al arrancar la máquina virtual java es darle la opción -Xmx128M donde 128 es el tamaño en megas que deseas de memoria. Puedes poner el valor que quieras.

Se bueno.
Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 22/02/2007, 13:21
 
Fecha de Ingreso: febrero-2006
Mensajes: 35
Antigüedad: 18 años, 3 meses
Puntos: 0
Re: java.lang.OutOfMemoryError: Java heap space

Como puedo hacer para tomar esas particiones Insertarlas en la otra base y despues liberar la memoria, o amentar la memoria de JVM.
Desde ya muchas gracias por tu tiempo, saludos.
  #4 (permalink)  
Antiguo 22/02/2007, 13:24
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Re: java.lang.OutOfMemoryError: Java heap space

Hola:

Al resulset pidele 10 datos en un bucle y los vas metiendo en un array o vector o lo que quieras. Luego inserta esos datos en la otra base de datos.

Luego pidele otros 10 datos, pero reutiliza el array o vector desde la posicion cero, machacando los anteriores. Otra inserción y así sucesivamente.

Quien dice 10 dice los que creas oportunos, pero sin pasarse.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 22/02/2007, 13:33
 
Fecha de Ingreso: febrero-2006
Mensajes: 35
Antigüedad: 18 años, 3 meses
Puntos: 0
Re: java.lang.OutOfMemoryError: Java heap space

Muchas gracias
  #6 (permalink)  
Antiguo 22/02/2007, 15:07
 
Fecha de Ingreso: febrero-2006
Mensajes: 35
Antigüedad: 18 años, 3 meses
Puntos: 0
Re: java.lang.OutOfMemoryError: Java heap space

Me parece que el problema es otro porque no puedo hacer que funcione, las lineas son muchas y no conosco forma para que valla borrando del Resultset las filas que ya inserte, aca dejo el codigo para ver si estoy haciendo algo mal

public static ResultSet Consulta(Connection conexion, String query)
{
Statement sentencia = null;
ResultSet resultado = null;

try
{
sentencia = conexion.createStatement();
resultado = sentencia.executeQuery(query);
resultado.setFetchSize(100000);
while (resultado.next())
{
System.out.println(resultado.getString(30));
resultado.deleteRow();
}
resultado.close();
sentencia.clearBatch();
sentencia.close();
return resultado;
}
catch(SQLException e)
{
System.out.println("Error al realizar la consulta2 "+e);
return resultado;
}
}
  #7 (permalink)  
Antiguo 17/10/2007, 03:13
 
Fecha de Ingreso: octubre-2007
Mensajes: 3
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: java.lang.OutOfMemoryError: Java heap space

Cita:
Iniciado por senseten Ver Mensaje
resultado.setFetchSize(100000);
Para empezar, casi seguro que esta linea es un problema. Si pones el tamaño de Fetch a 100.000, te está recuperando 100.000 registros de golpe y metiendolos todos en memoria. Yo lo he intentado con bastantes menos, y me da OutOfMemory incluso con 256 MB en la máquina virtual . Prueba con una cifra entre 1.000 y 5.000 que es más razonable. De todas formas, si la tabla es rápida (y con sólo 500.000 registros debería serlo), no debería ser necesario modificar el tamaño de fetch que tiene el driver por defecto

Cita:
Iniciado por senseten Ver Mensaje
resultado.deleteRow();
Aparte de eso, no es necesario que borres nada del ResultSet. De hecho, es posible que al hacerlo, estés borrando de la base de datos, así que ten cuidado.
  #8 (permalink)  
Antiguo 31/07/2011, 12:29
 
Fecha de Ingreso: julio-2011
Mensajes: 1
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: java.lang.OutOfMemoryError: Java heap space

En general, los problemas de memoria son complejos de resolver. Llevo tiempo intentando buscar algo gratuito que sirva, y por fin he encontrado esta herramienta:

http://ctoblog.lucierna.com/ultimate-weapon-lucierna-kill-memory-leaks/

Me ha pillado varios leaks en 30 minutos de carga, y te dice hasta la línea de código del sitio donde está el problema. A mi me gusta.

Espero que os sirva de ayuda.
  #9 (permalink)  
Antiguo 04/08/2011, 01:34
 
Fecha de Ingreso: mayo-2011
Mensajes: 79
Antigüedad: 13 años
Puntos: 14
Respuesta: java.lang.OutOfMemoryError: Java heap space

Que tal senseten,

Creo que deberías mirar como lanzar consultas paginadas a MYSQL e ir trayendo lso datos en bloques e irlos insertando en la de réplica.

Lo de ampliar la memoria de la JVM te puede solucionar la papeleta temporalmente, ya que conforme la tabla siga creciendo volverán a aparecerte los problemas.
__________________
Web Admin:
http://www.coretec.es
Tutoriales, Noticias y Recursos Liferay y J2EE
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 10:07.