Glassfish 4.1 java。lang.OutOfMemoryError异常
我的应用程序已经在glassfish服务器上运行了很长一段时间,今天一位应用程序用户警告我服务器意外关闭。在服务器日志中,我看到以下堆栈跟踪(服务器关闭前10个相同的堆栈跟踪):
[2016-01-23T10:35:35.144+0100] [glassfish 4.1] [WARNING] [] [org.glassfish.grizzly.filterchain.DefaultFilterChain] [tid: _ThreadID=30 _ThreadName=http-listener-1(4)] [timeMillis: 1453541735144] [levelValue: 900] [[
GRIZZLY0013: Exception during FilterChain execution
java.lang.OutOfMemoryError
at java.util.zip.Deflater.init(Native Method)
at java.util.zip.Deflater.<init>(Deflater.java:171)
at org.glassfish.grizzly.compression.zip.GZipEncoder$GZipOutputState.initialize(GZipEncoder.java:323)
at org.glassfish.grizzly.compression.zip.GZipEncoder$GZipOutputState.access$100(GZipEncoder.java:307)
at org.glassfish.grizzly.compression.zip.GZipEncoder.transformImpl(GZipEncoder.java:133)
at org.glassfish.grizzly.compression.zip.GZipEncoder.transformImpl(GZipEncoder.java:61)
at org.glassfish.grizzly.AbstractTransformer.transform(AbstractTransformer.java:73)
at org.glassfish.grizzly.http.GZipContentEncoding.encode(GZipContentEncoding.java:195)
at org.glassfish.grizzly.http.HttpCodecFilter.encodeContent(HttpCodecFilter.java:1628)
at org.glassfish.grizzly.http.HttpCodecFilter.encodeHttpPacket(HttpCodecFilter.java:1451)
at org.glassfish.grizzly.http.HttpServerFilter.encodeHttpPacket(HttpServerFilter.java:870)
at org.glassfish.grizzly.http.HttpCodecFilter.handleWrite(HttpCodecFilter.java:1347)
at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:848)
at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:817)
at org.glassfish.grizzly.http.io.OutputBuffer.flushBuffer(OutputBuffer.java:1024)
at org.glassfish.grizzly.http.io.OutputBuffer.flushBinaryBuffers(OutputBuffer.java:1011)
at org.glassfish.grizzly.http.io.OutputBuffer.flushAllBuffers(OutputBuffer.java:982)
at org.glassfish.grizzly.http.io.OutputBuffer.close(OutputBuffer.java:715)
at org.glassfish.grizzly.http.io.OutputBuffer.endRequest(OutputBuffer.java:378)
at org.glassfish.grizzly.http.server.Response.finish(Response.java:516)
at org.glassfish.grizzly.http.server.HttpServerFilter.afterService(HttpServerFilter.java:384)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:260)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
]]
我试图找出这个异常的原因,但我找不到任何有用的解释-没有一个答案描述这种异常(GRIZZLY0013:使用java.lang.OutOfMemoryError执行FilterChain期间的异常)。请任何人向我解释为什么会发生这种情况,我能做些什么来防止它再次发生
多谢各位
# 1 楼答案
java.lang.OutOfMemoryError
通常指向内存泄漏。这可能是由您的应用程序以及Glassfish造成的,因为两者都运行在同一个JVM中。异常仅表明JVM不能分配新对象,但不能告诉内存中的内容从stacktrace中,我猜Glassfish在将响应发送到浏览器之前正在尝试处理响应。在通过HTTP协议发送之前,resposne可能太大,无法在内存中压缩。尝试查看其他日志,以重建请求正在执行的操作以及它是否能够生成巨大的响应。但这只是一个猜测,因为可能还有其他与正在处理的请求完全无关的内存消耗原因
您还可以通过设置JVM选项-Xmx来增加Glassfish的内存限制
# 2 楼答案
服务器内存不足,然后JVM可能崩溃。写入HTTP响应时出错
设置JVM选项-XX:+heapdumponotofmemoryError,这样如果再次发生这种情况,您可以得到一个HeapDump,您可以使用Eclipse内存分析器工具包之类的工具进行分析,这样您就可以找出所有堆的用途