Glassfish 4.1 java.lang.OutOfMemoryError异常

问题描述:

我的应用程序已经运行在Glassfish服务器上相当长一段时间,现在和今天应用程序用户之一警告我说服务器意外关闭。在服务器日志中我看到下面的堆栈跟踪(10相同的堆栈跟踪服务器关闭前):Glassfish 4.1 java.lang.OutOfMemoryError异常

[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期间的异常)。可以请任何人向我解释为什么会发生这种情况,我能做些什么来防止它再次发生?

谢谢。

+0

你试过杀死处理器并重启服务器? – soorapadman

+0

该进程被自动关闭,我需要启动服务器。我想知道为什么发生这种情况,以及如何防止再次发生? – user4341206

服务器耗尽内存,然后JVM可能会崩溃。写入HTTP响应时发生错误。

设置JVM选项-XX:+ HeapDumpOnOutOfMemoryError,这样如果它再次发生,您可以获得一个HeapDump,您可以使用诸如Eclipse Memory Analyzer Toolkit之类的东西来分析,这样您可以找出所有堆的使用情况。

+0

是的,我知道这个错误是编写HTTP响应的结果。这怎么会发生?我的代码中是否存在错误或内存泄漏,或者这是灰熊框架中的错误? – user4341206

java.lang.OutOfMemoryError通常指向内存泄漏。这可能是由您的应用程序以及Glassfish造成的,因为它们都运行在相同的JVM中。该例外仅说明JVM不能分配新对象,但不会告诉持有内存的内容。

从stacktrace中,我猜测Glassfish试图在发送给浏览器之前处理响应。我可能会发生这样的情况:在通过HTTP协议发送之前,resposne太大而无法在内存中进行压缩。尝试查看其他日志以重新构建请求所做的事情以及是否可以产生巨大的响应。但这只是一个猜测,因为可能还有其他与正在处理的请求完全无关的内存消耗原因。

您也可以通过设置JVM选项-Xmx来增加Glassfish的内存限制。