有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

多谢各位


共 (2) 个答案

  1. # 1 楼答案

    java.lang.OutOfMemoryError通常指向内存泄漏。这可能是由您的应用程序以及Glassfish造成的,因为两者都运行在同一个JVM中。异常仅表明JVM不能分配新对象,但不能告诉内存中的内容

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

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

  2. # 2 楼答案

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

    设置JVM选项-XX:+heapdumponotofmemoryError,这样如果再次发生这种情况,您可以得到一个HeapDump,您可以使用Eclipse内存分析器工具包之类的工具进行分析,这样您就可以找出所有堆的用途