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