En este grupo En todos

Foro de Java



Error Out of Memory generando reporte desde Java

Fernando
Tecnologia sistemas de informacion itm
Escrito por Fernando Buitrago Arboleda
el 12/08/2010

Hola amigos,

Estoy llamando un jasperreport desde JAVA y me sale el siguiente error:

java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream. ToByteArray(ByteArrayOutputStream. Java:136)
at net.sf.jasperreports. engine.base.JRVirtualPrintPage. WriteObject(JRVirtualPrintPage. Java:430)
at sun.reflect.NativeMethodAccessorImpl. Invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl. Invoke(NativeMethodAccessorImpl. Java:39)
at sun.reflect.DelegatingMethodAccessorImpl. Invoke(DelegatingMethodAccessorImpl. Java:25)
at java.lang.reflect. Method. Invoke(Method. Java:585)
at java.io.ObjectStreamClass. InvokeWriteObject(ObjectStreamClass. Java:917)
at java.io.ObjectOutputStream. WriteSerialData(ObjectOutputStream. Java:1339)
at java.io.ObjectOutputStream. WriteOrdinaryObject(ObjectOutputStream. Java:1290)
at java.io.ObjectOutputStream. WriteObject0(ObjectOutputStream. Java:1079)
at java.io.ObjectOutputStream. WriteObject(ObjectOutputStream. Java:302)
at java.util.ArrayList. WriteObject(ArrayList. Java:569)
at sun.reflect.NativeMethodAccessorImpl. Invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl. Invoke(NativeMethodAccessorImpl. Java:39)
at sun.reflect.DelegatingMethodAccessorImpl. Invoke(DelegatingMethodAccessorImpl. Java:25)
at java.lang.reflect. Method. Invoke(Method. Java:585)
at java.io.ObjectStreamClass. InvokeWriteObject(ObjectStreamClass. Java:917)
at java.io.ObjectOutputStream. WriteSerialData(ObjectOutputStream. Java:1339)
at java.io.ObjectOutputStream. WriteOrdinaryObject(ObjectOutputStream. Java:1290)
at java.io.ObjectOutputStream. WriteObject0(ObjectOutputStream. Java:1079)
at java.io.ObjectOutputStream. DefaultWriteFields(ObjectOutputStream. Java:1375)
at java.io.ObjectOutputStream. WriteSerialData(ObjectOutputStream. Java:1347)
at java.io.ObjectOutputStream. WriteOrdinaryObject(ObjectOutputStream. Java:1290)
at java.io.ObjectOutputStream. WriteObject0(ObjectOutputStream. Java:1079)
at java.io.ObjectOutputStream. WriteObject(ObjectOutputStream. Java:302)
at net.sf.jasperreports. engine.util.JRSaver. SaveObject(JRSaver. Java:78)
at net.sf.jasperreports. engine.util.JRSaver. SaveObject(JRSaver. Java:58)
at net.sf.jasperreports. engine.JasperFillManager.fillReportToFile(JasperFillManager. Java:190)
at net.sf.jasperreports. engine.JasperFillManager.fillReportToFile(JasperFillManager. Java:94)
at com.intap.intap. utilidades.generales.CargaInformesNoPreview. Llenar(CargaInformesNoPreview. Java:216)
at com.intap.intap. utilidades.generales.CargaInformesNoPreview. <init>(CargaInformesNoPreview. Java:86)
at co.com.intap. mineros.compras.solicitudes. consulta.control.ControlJIFInformeSeguimientoSC. CargarInforme(ControlJIFInformeSeguimientoSC. Java:246)


Ya he intentado virtualizar mi informe y siempre me sale el mismo error cuando la consulta me devuelve muchos registros.
Lo he intentado virtualizar de la siguiente forma:

JRConcurrentSwapFile jrSwapFile =
new JRConcurrentSwapFile(temporalDir. ToString(),2048,1024);
JRSwapFileVirtualizer virtualizer =
new JRSwapFileVirtualizer(5000,jrSwapFile, true ); mapParametros. Put(JRParameter. REPORT_VIRTUALIZER, virtualizer);

La cantidad de registros puede variar considerablemente segun los criterios de busqueda.

Si alguien sabe como solucionar este problema, le agradezco su ayuda.

Paco Romero
Telecomunicaciones sevilla
Escrito por Paco Romero
el 12/04/2011

No se si ya resolvistes el problema pero una posible solución, al menos de forma temporal, puede ser el incrementar la memoria de la máquina virtual.

Puedes encontrar información mas detallada en:

https://programargoogleando.blogspot.com/2011/04/memoria-per-gem-en-aplicaciones-java. Html

Fernando Buitrago Arboleda
Tecnologia sistemas de informacion itm
Escrito por Fernando Buitrago Arboleda
el 12/04/2011

Gracias Paco por la respuesta.
Si, ya lo resolví.
El problema lo tenía en java 5. Una alternativa fue esa. Simplemente corrí mi aplicativo con estos parametros:
-Xms256m -Xmx256m

Esto para destinarle mas memoria a mi proceso en el java heap memory.

Otra opción por la que tuve que recurrir fue virtualizar el informe. Esto consiste en básicamente guardar los registros en ciertos archivos en mi disco y luego los recorro y los muestro en mi informe. Esto hace mas lento el informe, pero puedo mostrar una gran cantidad de registros sin que exista un desbordamiento con el java heap memory.

Cuando nos actualizamos a java 6, noté una diferencia bien grande con la administración propia del java con el java heap memory. Ya no era tan necesario destinarle la memoria que le estaba asignando a mi programa con esos parametros. Al examinar detenidamente el java heap memory del proceso de mi aplicación, me di cuenta que cuando empezaba a utilizar mas de la que tenia asignada el proceso, java automaticamente le asignaba mas memoria, por lo tanto el mismo administra de forma inteligente los recursos de mi máquina.

Espero les sirva a todos los que han tenido estos tipos de problemas.