Erreur d'espace Java Heap dans glassfish
-
03-07-2019 - |
Question
J'utilise une nouvelle installation Glassfish avec très peu de personnalisations.
J'ai un bean géré par message (ObjectUpdateMDB) qui écoute un sujet, puis met à jour l'objet qu'il reçoit dans une base de données. Il y a beaucoup d'objets en cours de mise à jour. Après un certain temps, je reçois cette exception:
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
On dirait que c'est un problème avec Heap Space. De quoi ai-je besoin pour ajuster l'espace du tas? Le serveur d'applications lui-même ou le courtier? Comment je fais ça?
La solution
Vous devez affecter plus de RAM à votre installation Glassfish.
Voir http://spaquet.blogspot.com/2006/07/liferay-glassfish-part-ii-configuring.html
Autres conseils
J'ai utilisé les commandes asadmin
suivantes pour résoudre le problème sur 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'
C’est une variation de l’allusion de Michael Myers. L'utilisation des commandes asadmin
permet de répéter facilement les modifications.
De plus, je suis passé au nouveau collecteur G1, qui est bien meilleur que le collecteur normal. Aide également avec Eclipse ;-)
Notez que la syntaxe est pour TakeCommand sous Windows. Si vous utilisez une combinaison différente de shell et de système d'exploitation, vous aurez peut-être besoin de caractères d'échappement différents (i.E. strait ticks au lieu de backticks pour la plupart des shells Unix).
Si vous dérangez votre configuration avec les commandes * - jvm-options
, vous pouvez y remédier avec le fichier domain.xml
.
J'ai un post sur mon blog à propos de Optimisation de la machine virtuelle et les lecteurs pointés vers le Optimisation Java Livre blanc .
Quoi qu'il en soit, pour obtenir une réponse rapide, vous devriez probablement examiner quelques paramètres de base:
-Xms: taille initiale du segment de mémoire
-Xmx: taille maximale du segment de mémoire
Pour obtenir une description rapide de ces opérations, exécutez simplement: java -X.
./ alex
Je ne sais pas si cela est lié, mais nous avons eu quelques exceptions étranges lors de l'utilisation de XA Transactions, ce qui a entraîné des exceptions CORBA. La raison en était le pilote MySQL et nous avons mis à jour le dernier pilote MySQL JDBC (5.1.7), puis ces problèmes XA ont disparu.