glassfish中的Java堆空间错误

问题描述:

我正在使用一个新鲜的Glassfish安装,只有很少的自定义设置。glassfish中的Java堆空间错误

我有驱动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 

看起来这是一个堆空间的问题。我需要调整堆空间的大小?应用服务器本身还是经纪人?我该怎么做呢?

+0

是否有VMArg这样做?我将如何做到这一点? – systemoutprintln 2009-03-04 22:03:19

我在我的博客上有一篇关于VM tuning的文章,我正在将读者指向Java Tuning White Paper

不管怎么说,让你快速的答案,你可能应该考虑几个基本设置:

-Xms:初始堆大小

-Xmx:最大堆大小

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

./alex

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

我用下面的命令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以及帮助;-)

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

如果你用*-jvm-options命令搞乱你的设置,那么你可以用domain.xml文件修复它。