glassfish中的Java Heap Space错误

时间:2009-03-04 21:54:50

标签: java glassfish application-server out-of-memory jboss-mdb

我正在使用新的Glassfish安装,只需很少的自定义。

我有一个消息驱动Bean(ObjectUpdateMDB),它监听一个主题,然后更新它在数据库中收到的对象。有很多对象正在更新。经过一段时间的运行,我得到了这个例外:

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

看起来这是堆空间的问题。我需要什么来调整堆空间? App Server本身还是经纪人?我该怎么做?

4 个答案:

答案 0 :(得分:9)

答案 1 :(得分:7)

我使用以下asadmin命令对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'

这是迈克尔迈尔斯提示的一个变种。使用asadmin命令可以轻松地重复更改。

此外,我切换到新的G1收集器,这比普通收集器好很多。也帮助Eclipse; - )

请注意,语法适用于Windows上的TakeCommand。如果你使用shell和OS的不同组合,你可能需要不同的转义字符(对于大多数unix shell而言,i.E。strait ticks而不是反引号)。

如果您使用*-jvm-options命令弄乱了设置,则可以使用domain.xml文件修复它。

答案 2 :(得分:1)

我的博客上有一篇关于VM tuning的帖子,我指的是读者Java Tuning White Paper

无论如何,为了给你快速回答,你应该考虑几个基本设置:

-Xms:初始堆大小

-Xmx:最大堆大小

要快速描述这些只是运行:java -X。

./亚历

答案 3 :(得分:0)

我不知道这是否相关,但是在使用导致CORBA异常的XA事务时我们遇到了一些奇怪的例外。原因是MySQL驱动程序,我们升级到最新的MySQL JDBC驱动程序(5.1.7),然后这些XA问题就消失了。