9

我正在使用全新的 Glassfish 安装,几乎没有自定义。

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

严重:JTS5031:资源 [回滚] 操作上的异常 [org.omg.CORBA.INTERNAL:vmcid:0x0 次要代码:0 已完成:可能]。
严重:MDB00049:消息驱动 bean [Persistence:ObjectUpdateMDB]:postinvoke 中的异常:[javax.transaction.SystemException:org.omg.CORBA.INTERNAL:JTS5031:异常 [org.omg.CORBA.INTERNAL:vmcid:0x0 次要代码: 0 完成:可能] 对资源 [回滚] 操作。vmcid:0x0 次要代码:0 已完成:否]
严重:javax.transaction.SystemException
javax.transaction.SystemException:org.omg.CORBA.INTERNAL:JTS5031:资源[回滚]操作上的异常[org.omg.CORBA.INTERNAL:vmcid:0x0次要代码:0已完成:可能]。vmcid:0x0 次要代码:0 已完成:否
    在 com.sun.jts.jta.TransactionManagerImpl.rollback(TransactionManagerImpl.java:350)
    在 com.sun.enterprise.distributedtx.J2EETransactionManagerImpl.rollback(J2EETransactionManagerImpl.java:1144)
    在 com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.rollback(J2EETransactionManagerOpt.java:426)
    在 com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3767)
    在 com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
    在 com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1226)
    在 com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1197)
    在 com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:79)
    在 com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:139)
    在 $Proxy98.afterDelivery(未知来源)
    在 com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:324)
    在 com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:76)
    在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

信息:MDB00037:[Persistence:ObjectUpdateMDB]:消息驱动的 bean 调用异常:[java.lang.OutOfMemoryError:Java 堆空间]
信息:java.lang.OutOfMemoryError
java.lang.OutOfMemoryError:Java 堆空间

看起来这是堆空间的问题。我需要调整堆空间做什么?应用服务器本身还是代理?我该怎么做呢?

4

4 回答 4

9

您需要为 Glassfish 安装分配更多 RAM。

http://spaquet.blogspot.com/2006/07/liferay-glassfish-part-ii-configuring.html

http://docs.sun.com/app/docs/doc/820-4495/gepzd?a=view

于 2009-03-04T22:00:25.413 回答
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 和操作系统组合,您可能需要不同的转义字符(对于大多数 unix shell,iE 海峡记号而不是反引号)。

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

于 2011-02-11T14:00:25.073 回答
1

我的博客上有一篇关于VM 调优的文章,我正在向读者介绍Java 调优白皮书

无论如何,为了让您快速获得答案,您可能应该查看几个基本设置:

-Xms:初始堆大小

-Xmx:最大堆大小

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

./亚历克斯

于 2009-03-04T22:16:00.743 回答
0

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

于 2009-03-07T11:19:05.277 回答