Java Heap-Speicher Fehler in Glasfischen
-
03-07-2019 - |
Frage
Ich verwende eine frische Glassfish mit sehr wenig Anpassungen installieren.
Ich habe eine Message Driven Bean (ObjectUpdateMDB), die zu einem Thema zuhört, dann aktualisiert das Objekt in einer Datenbank empfängt. Es gibt eine Menge von Objekten aktualisiert. Nach einer gewissen Zeit des Laufens bekomme ich diese Ausnahme:
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
Sieht aus wie es ein Problem mit Heap-Speicher ist. Was benötige ich für den Heap-Speicher einstellen? Der App-Server selbst oder der Broker? Wie mache ich das?
Lösung
Sie müssen sich mehr RAM auf Ihre Installation Glassfish zuweisen.
Siehe http://spaquet.blogspot.com/2006/07/liferay-glassfish-part-ii-configuring.html
und http://docs.sun.com/app/docs/doc/820-4495/gepzd?a=view .
Andere Tipps
Ich habe die folgende asadmin
Befehle zu sortieren, das Problem auf Glassfish 3.1 verwendet:
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 ist eine Variante Michael Myers Hinweis. asadmin
Befehlen macht die Änderung leicht wiederholbar.
Auch wechselte ich auf die neuen G1 Sammler, die viel besser als die normalen Sammler. Hilft mit Eclipse als auch, -)
Beachten Sie, dass Syntax für TakeCommand auf Windows. Wenn Sie eine andere Kombination von Shell und OS verwenden können Sie verschiedene Escape-Zeichen benötigen (d Straße Ticks statt Backticks für die meisten Unix-Shells).
Wenn Sie Schlamassel Ihr Setup auf den *-jvm-options
Befehle dann können Sie es mit domain.xml
Datei beheben.
Ich habe einen Kommentar auf meinem Blog über Java Tuning White Paper .
Wie auch immer, Sie eine schnelle Antwort bekommen Sie wahrscheinlich in ein paar Grundeinstellungen aussehen sollte:
-Xms: anfängliche Heapgröße
-Xmx: maximale Speichergröße
Um eine schnelle Beschreibungen für diese nur laufen zu bekommen. Java -X
./ alex
Ich weiß nicht, ob dies zusammenhängt, aber wir haben einige seltsame Ausnahmen, wenn XA-Transaktionen verwendet, die in CORBA Ausnahmen geführt. Der Grund dafür war der Fahrer MySQL und wir ein Upgrade auf die neuesten MySQL JDBC-Treiber (5.1.7) und dann verschwanden diese XA Probleme.