Out of memory GlassFish 4.1筛选器链执行期间的OutOfMemoryError

Out of memory GlassFish 4.1筛选器链执行期间的OutOfMemoryError,out-of-memory,glassfish-4,Out Of Memory,Glassfish 4,我在GlassFish 4.1中使用WebSocket的web应用程序已经有一段时间了,它一直运行良好,直到最近我两次遇到这个问题。它导致我的应用程序如预期的那样崩溃,我还不能确定确切的原因。以下是我得到的错误跟踪: GRIZZLY0013: Exception during FilterChain execution java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:31

我在GlassFish 4.1中使用WebSocket的web应用程序已经有一段时间了,它一直运行良好,直到最近我两次遇到这个问题。它导致我的应用程序如预期的那样崩溃,我还不能确定确切的原因。以下是我得到的错误跟踪:

GRIZZLY0013: Exception during FilterChain execution
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:261)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
    at java.util.ArrayList.add(ArrayList.java:458)
    at org.glassfish.grizzly.filterchain.FilterChainContext.addCompletionListener(FilterChainContext.java:930)
    at org.glassfish.grizzly.utils.IdleTimeoutFilter.queueAction(IdleTimeoutFilter.java:249)
    at org.glassfish.grizzly.utils.IdleTimeoutFilter.handleRead(IdleTimeoutFilter.java:167)
    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)
从跟踪中可以看出,FilterChainContext.addCompletionListener被调用的次数太多,导致ArrayList的大小大大增加—占用了内存。是什么导致服务器多次添加这种类型的侦听器?服务器是否接收到太多请求?这是一个GlassFish bug还是仅仅与增加堆大小有关

目前,我已经将由标志-Xmx表示的堆大小从512MB增加到2GB。还通过-XX:+UseParallelGC为GC强制执行并行收集器


如果您能提供进一步的见解来帮助解决这个问题,那将是非常棒的

我已经很长时间没有解决这个问题了,但我想分享一下我所做的改变,以防它能帮助那些面临同样问题的人——那些和我一样犯同样错误的人

问题出在我的申请上。在我的代码深处,应用程序为每个新的客户端请求创建了一个新对象。像这样:

Worker workerObj = new Worker();
最初,在部署时,这不会导致任何问题,因为服务器负载要少得多,但随着客户端的快速增加,内存消耗越来越多,最终导致服务器崩溃


解决方案是创建一个Worker对象,并以线程安全的方式重新使用所有请求。

我已经很长时间没有解决这个问题了,但我想与大家分享我所做的更改,以防它帮助那些面临同样问题的人——他们和我一样犯同样的错误

问题出在我的申请上。在我的代码深处,应用程序为每个新的客户端请求创建了一个新对象。像这样:

Worker workerObj = new Worker();
最初,在部署时,这不会导致任何问题,因为服务器负载要少得多,但随着客户端的快速增加,内存消耗越来越多,最终导致服务器崩溃


解决方案是创建一个Worker对象,并以线程安全的方式重新使用所有请求。

您可能希望尝试使用它,或者如果它是一个固定错误,您可能希望尝试使用它,或者如果它是一个固定错误,您可能希望尝试使用它