【问题标题】:Glassfish 4.1 java.lang.OutOfMemoryError exceptionGlassfish 4.1 java.lang.OutOfMemoryError 异常
【发布时间】:2016-01-23 12:11:17
【问题描述】:

我的应用程序已经在 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 期间出现异常)。请任何人向我解释为什么会发生这种情况以及我可以做些什么来防止它再次发生?

谢谢。

【问题讨论】:

  • 你试过杀死处理器并重新启动服务器吗?
  • 进程被自动关闭,我需要启动服务器。我想知道为什么会发生这种情况以及如何防止再次发生?

标签: java glassfish glassfish-4


【解决方案1】:

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

设置 JVM 选项 -XX:+HeapDumpOnOutOfMemoryError,这样如果再次发生,您可以获得一个 HeapDump,您可以使用 Eclipse Memory Analyzer Toolkit 之类的工具对其进行分析,这样您就可以找出所有堆的使用情况。

【讨论】:

  • 是的,我知道错误是编写 HTTP 响应的结果。这怎么可能发生?我的代码中是否存在错误或内存泄漏,或者这是 grizzly 框架中的错误?
【解决方案2】:

java.lang.OutOfMemoryError 通常表示内存泄漏。这可能是由您的应用程序和 Glassfish 引起的,因为两者都在同一个 JVM 中运行。异常只说明 JVM 不能分配新的对象,但没有说明是什么持有内存。

从堆栈跟踪中,我猜 Glassfish 试图在将响应发送到浏览器之前对其进行处理。我可能会碰巧响应太大而无法在通过 HTTP 协议发送之前在内存中压缩。尝试查看其他日志以重建请求正在执行的操作以及它是否会产生巨大的响应。但这只是一个猜测,因为可能存在与正在处理的请求完全无关的其他内存消耗原因。

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

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多