2

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

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)
4

5 回答 5

8

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

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

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

于 2011-05-19T10:27:01.580 回答
1

西蒙尼克森的答案是正确的

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

于 2011-05-19T10:58:49.657 回答
1

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

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

** 编辑...

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

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

于 2011-05-19T14:50:05.810 回答
0

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

于 2011-05-19T12:24:34.460 回答
0

这意味着 JVM 已经用完了分配给它的所有内存。您可以使用 -Xms 和 -Xmx 命令行参数更改分配给 JVM 使用的内存量。在此处检查根本原因

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

于 2013-08-08T12:17:09.483 回答