Error de Java Heap Space en glassfish
-
03-07-2019 - |
Pregunta
Estoy usando una instalación nueva de Glassfish con muy pocas personalizaciones.
Tengo un Bean controlado por mensaje (ObjectUpdateMDB) que escucha un tema y luego actualiza el objeto que recibe en una base de datos. Hay muchos objetos que se están actualizando. Después de un tiempo de ejecución me sale esta excepción:
SEVERE: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. SEVERE: MDB00049: Message-driven bean [Persistence:ObjectUpdateMDB]: Exception in postinvoke : [javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No] SEVERE: javax.transaction.SystemException javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No at com.sun.jts.jta.TransactionManagerImpl.rollback(TransactionManagerImpl.java:350) at com.sun.enterprise.distributedtx.J2EETransactionManagerImpl.rollback(J2EETransactionManagerImpl.java:1144) at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.rollback(J2EETransactionManagerOpt.java:426) at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3767) at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571) at com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1226) at com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1197) at com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:79) at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:139) at $Proxy98.afterDelivery(Unknown Source) at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:324) at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:76) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555) INFO: MDB00037: [Persistence:ObjectUpdateMDB]: Message-driven bean invocation exception: [java.lang.OutOfMemoryError: Java heap space] INFO: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Java heap space
Parece que es un problema con Heap Space. ¿Para qué necesito ajustar el espacio de almacenamiento dinámico? ¿El propio servidor de aplicaciones o el broker? ¿Cómo hago esto?
Solución
Debe asignar más RAM a su instalación de Glassfish.
Ver http://spaquet.blogspot.com/2006/07/liferay-glassfish-part-ii-configuring.html
Otros consejos
He utilizado los siguientes comandos asadmin
para solucionar el problema en Glassfish 3.1:
asadmin create-jvm-options --target server-config -- '-XX\:+UnlockExperimentalVMOptions'
asadmin create-jvm-options --target server-config -- '-XX\:+UseG1GC'
asadmin delete-jvm-options --target server-config -- '-Xmx512m'
asadmin create-jvm-options --target server-config -- '-Xmx1024m'
asadmin delete-jvm-options --target server-config -- '-XX\:MaxPermSize=192m'
asadmin create-jvm-options --target server-config -- '-XX\:MaxPermSize=256m'
asadmin create-jvm-options --target default-config -- '-XX\:+UnlockExperimentalVMOptions'
asadmin create-jvm-options --target default-config -- '-XX\:+UseG1GC'
asadmin delete-jvm-options --target default-config -- '-Xmx512m'
asadmin create-jvm-options --target default-config -- '-Xmx1024m'
asadmin delete-jvm-options --target default-config -- '-XX\:MaxPermSize=192m'
asadmin create-jvm-options --target default-config -- '-XX\:MaxPermSize=256m'
Es una variación de la sugerencia de Michael Myers. El uso de los comandos asadmin
hace que el cambio sea fácilmente repetible.
También cambié al nuevo colector G1, que es mucho mejor que el colector normal. También ayuda con Eclipse ;-)
Tenga en cuenta que la sintaxis es para TakeCommand en Windows. Si usa una combinación diferente de shell y sistema operativo, es posible que necesite diferentes caracteres de escape (i.E. strait ticks en lugar de backticks para la mayoría de shells de Unix).
Si arruinas tu configuración con los comandos * -jvm-options
, entonces puedes corregirlo con el archivo domain.xml
.
Tengo una publicación en mi blog sobre VM Tuning y estoy apuntando a los lectores a Ajuste de Java Libro Blanco .
De todos modos, para obtener una respuesta rápida, probablemente debas buscar un par de configuraciones básicas:
-Xms: tamaño de pila inicial
-Xmx: tamaño máximo de pila
Para obtener una descripción rápida de estos solo ejecute: java -X.
./alex
No sé si esto está relacionado, pero obtuvimos algunas excepciones extrañas cuando usamos Transacciones XA que resultaron en excepciones CORBA. El motivo fue el controlador MySQL y actualizamos al último controlador JDBC de MySQL (5.1.7) y luego estos problemas de XA desaparecieron.