java.lang.OutOfMemoryError:Java堆空间

时间:2011-05-19 10:17:17

标签: java jvm weblogic muxer

我的应用程序部署在集群环境中。最近,服务器因以下堆栈跟踪而崩溃。它似乎不是来自代码。它一直在运行,直到最近这个错误弹出。没有对服务器进行重大更改。有人可以建议吗?

java.lang.OutOfMemoryError: Java heap space
    at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:44)
    at java.lang.StringBuilder.<init>(StringBuilder.java:69)
    at java.io.ObjectStreamClass$FieldReflectorKey.<init>(ObjectStreamClass.java:2106)
    at java.io.ObjectStreamClass.getReflector(ObjectStreamClass.java:2039)
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:586)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1591)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at weblogic.utils.io.ChunkedObjectInputStream.readObject(ChunkedObjectInputStream.java:195)
    at weblogic.rjvm.MsgAbbrevInputStream.readObject(MsgAbbrevInputStream.java:565)
    at weblogic.utils.io.ChunkedObjectInputStream.readObject(ChunkedObjectInputStream.java:191)
    at weblogic.rmi.internal.dgc.DGCServerImpl_WLSkel.invoke(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475)
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59)
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016)
    at weblogic.work.SelfTuningWorkManagerImpl.schedule(SelfTuningWorkManagerImpl.java:126)
    at weblogic.rmi.internal.BasicServerRef.dispatch(BasicServerRef.java:321)
    at weblogic.rmi.internal.BasicServerRef.dispatch(BasicServerRef.java:918)
    at weblogic.rjvm.RJVMImpl.dispatchRequest(RJVMImpl.java:1084)
    at weblogic.rjvm.RJVMImpl.dispatch(RJVMImpl.java:1001)
    at weblogic.rjvm.ConnectionManagerServer.handleRJVM(ConnectionManagerServer.java:240)
    at weblogic.rjvm.ConnectionManager.dispatch(ConnectionManager.java:877)
    at weblogic.rjvm.MsgAbbrevJVMConnection.dispatch(MsgAbbrevJVMConnection.java:446)
    at weblogic.rjvm.t3.MuxableSocketT3.dispatch(MuxableSocketT3.java:368)
    at weblogic.socket.AbstractMuxableSocket.dispatch(AbstractMuxableSocket.java:383)
    at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:872)

5 个答案:

答案 0 :(得分:8)

您的内存不足,这表明存在以下情况之一:

  • 您需要为进程提供更多内存(使用-Xmx java命令行选项);或
  • 你有内存泄漏

如果没有更多信息,很难说是哪种情况。 OutOfMemoryError的堆栈跟踪很少有用,因为它只显示堆耗尽的点;它没有告诉你填充堆的原因。

答案 1 :(得分:1)

Simon Nickerson的回答是正确的

只需添加,您的堆栈跟踪从weblogic.socket.SocketMuxer.readReadySocketOnce开始,这是接受传入请求的内部weblogic类。所以这意味着服务器没有足够的内存来接受请求。

答案 2 :(得分:1)

您使用的是JRockit JVM吗?如果您是,您可以使用JRockit Mission Control并监视Java堆使用情况。您还可以使用JRockit Flight Recorder记录JVM事件以进行离线分析。这里有一个关于此的Oracle网络广播:http://www.vimeo.com/22109838。您可以跳到4:54,这是JRockit,WLDF和JRF的概述开始的地方。

请记住,当堆已满时,NEXT操作会因OutOfMemory异常而失败,因此此堆栈跟踪可能不会指示任何失败原因。这只是表明当这段代码运行时没有足够的堆,而不是这段代码导致堆填满。

**编辑......

显然,服务器内存不足 - 在此特定操作时。问题是......为什么?这个堆栈跟踪没有告诉你 - 为什么它只是表明当时发生的任何事情都无法完成,因为当时没有足够的可用内存。这并不意味着它是问题的原因。

当然,您可以添加更多内存,但这可能无法解决问题 - 它可能只需要更长时间才能显示。

答案 3 :(得分:0)

设置catalina.sh/bat find set JAVA_OPTS =%JAVA_OPTS% 什么你的RAM - 调整但不提供超过一半的RAM set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -server -Xms512M -Xmx512M -XX:MaxPermSize=256M

答案 4 :(得分:0)

这意味着JVM已经耗尽了已分配给它的所有内存。您可以使用-Xms和-Xmx命令行参数更改分配给JVM使用的内存量。检查root cause here

Java中的OutOfMemoryError是java.lang.VirtualMachineError的子类,当堆中的内存不足时,JVM会抛出java.lang.OutOfMemoryError。当你尝试创建一个对象并且堆中没有足够的空间来分配该对象时,Java中的OutOfMemoryError可以随时出现在堆中