升级Vaadin 23.2.x后周期性出现PendingJavaScriptInvocation内存溢出问题求助
Vaadin 23.2.x升级后PendingJavaScriptInvocation引发的OutOfMemoryError问题
升级至Vaadin 23.2.x版本后,周期性遭遇如下OutOfMemoryError错误:
com.vaadin.flow.component.internal.PendingJavaScriptInvocation - 对象数量(1663070)
线程栈信息
https-jsse-nio-8443-exec-5 at com.vaadin.flow.dom.Element$$Lambda$1668.get$Lambda(Lcom/vaadin/flow/component/internal/PendingJavaScriptInvocation;)Lcom/vaadin/flow/function/SerializableConsumer; (Unknown Source) at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source) at java.lang.invoke.Invokers$Holder.linkToTargetMethod(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source) at com.vaadin.flow.dom.Element.lambda$scheduleJavaScriptInvocation$9c7dc614$1(Lcom/vaadin/flow/internal/StateNode;Lcom/vaadin/flow/component/internal/PendingJavaScriptInvocation;Lcom/vaadin/flow/component/UI;)V (Element.java:1493) at com.vaadin.flow.dom.Element$$Lambda$1316.accept(Ljava/lang/Object;)V (Unknown Source) at com.vaadin.flow.internal.StateNode.runWhenAttached(Lcom/vaadin/flow/function/SerializableConsumer;)V (StateNode.java:895) at com.vaadin.flow.dom.Element.scheduleJavaScriptInvocation(Ljava/lang/String;Ljava/util/stream/Stream;)Lcom/vaadin/flow/component/page/PendingJavaScriptResult; (Element.java:1493) at com.vaadin.flow.dom.Element.callJsFunction(Ljava/lang/String;[Ljava/io/Serializable;)Lcom/vaadin/flow/component/page/PendingJavaScriptResult; (Element.java:1392) at com.vaadin.flow.component.combobox.ComboBoxDataController$UpdateQueue.lambda$enqueue$0(Ljava/lang/String;[Ljava/io/Serializable;)V (ComboBoxDataController.java:109) at com.vaadin.flow.component.combobox.ComboBoxDataController$UpdateQueue$$Lambda$1789.run()V (Unknown Source) at com.vaadin.flow.component.combobox.ComboBoxDataController$UpdateQueue$$Lambda$1793.accept(Ljava/lang/Object;)V (Unknown Source) at java.util.ArrayList.forEach(Ljava/util/function/Consumer;)V (ArrayList.java:1541) at com.vaadin.flow.component.combobox.ComboBoxDataController$UpdateQueue.commit(I)V (ComboBoxDataController.java:103) at com.vaadin.flow.data.provider.DataCommunicator.passivateInactiveKeys(Ljava/util/Set;Lcom/vaadin/flow/data/provider/ArrayUpdater$Update;Z)V (DataCommunicator.java:1304) at com.vaadin.flow.data.provider.DataCommunicator.performUpdate(Ljava/util/Set;Lcom/vaadin/flow/internal/Range;Lcom/vaadin/flow/internal/Range;Lcom/vaadin/flow/data/provider/DataCommunicator$Activation;)V (DataCommunicator.java:1225) at com.vaadin.flow.data.provider.DataCommunicator.flush()V (DataCommunicator.java:1171) at com.vaadin.flow.data.provider.DataCommunicator.lambda$requestFlush$7258256f$1(Lcom/vaadin/flow/internal/ExecutionContext;)V (DataCommunicator.java:1103) at com.vaadin.flow.data.provider.DataCommunicator$$Lambda$1416.accept(Ljava/lang/Object;)V (Unknown Source) at com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$2(Lcom/vaadin/flow/internal/StateTree$BeforeClientResponseEntry;)V (StateTree.java:392) at com.vaadin.flow.internal.StateTree$$Lambda$1720.accept(Ljava/lang/Object;)V (Unknown Source) at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Ljava/lang/Object;)V (ForEachOps.java:183) at java.util.stream.ReferencePipeline$2$1.accept(Ljava/lang/Object;)V (ReferencePipeline.java:177) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Ljava/util/function/Consumer;)V (ArrayList.java:1655) at java.util.stream.AbstractPipeline.copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V (AbstractPipeline.java:484) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)Ljava/util/stream/Sink; (AbstractPipeline.java:474) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Void; (ForEachOps.java:150) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object; (ForEachOps.java:173) at java.util.stream.AbstractPipeline.evaluate(Ljava/util/stream/TerminalOp;)Ljava/lang/Object; (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(Ljava/util/function/Consumer;)V (ReferencePipeline.java:497) at com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse()V (StateTree.java:389) at com.vaadin.flow.server.communication.UidlWriter.encodeChanges(Lcom/vaadin/flow/component/UI;Lelemental/json/JsonArray;)V (UidlWriter.java:390) at com.vaadin.flow.server.communication.UidlWriter.createUidl(Lcom/vaadin/flow/component/UI;ZZ)Lelemental/json/JsonObject; (UidlWriter.java:174) at com.vaadin.flow.server.communication.UidlRequestHandler.createUidl(Lcom/vaadin/flow/component/UI;Z)Lelemental/json/JsonObject; (UidlRequestHandler.java:158) at com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(Lcom/vaadin/flow/component/UI;Ljava/io/Writer;Z)V (UidlRequestHandler.java:146) at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(Lcom/vaadin/flow/server/VaadinSession;Lcom/vaadin/flow/server/VaadinRequest;Lcom/vaadin/flow/server/VaadinResponse;)Z (UidlRequestHandler.java:116) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(Lcom/vaadin/flow/server/VaadinSession;Lcom/vaadin/flow/server/VaadinRequest;Lcom/vaadin/flow/server/VaadinResponse;)Z (SynchronizedRequestHandler.java:40) at com.vaadin.flow.server.VaadinService.handleRequest(Lcom/vaadin/flow/server/VaadinRequest;Lcom/vaadin/flow/server/VaadinResponse;)V (VaadinService.java:1564) at com.vaadin.flow.server.VaadinServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V (VaadinServlet.java:364) at com.vaadin.cdi.CdiVaadinServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V (CdiVaadinServlet.java:67) at javax.servlet.http.HttpServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (AbstractAccessLogValve.java:690) at org.apache.catalina.valves.RemoteIpValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (RemoteIpValve.java:764) at org.apache.catalina.core.StandardEngineValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V (StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V (CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Lorg/apache/tomcat/util/net/SocketWrapperBase;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState; (Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState; (AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState; (AbstractProtocol.java:888) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun()V (NioEndpoint.java:1597) at org.apache.tomcat.util.net/SocketProcessorBase.run()V (SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1128) at java.util.concurrent.ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run()V (TaskThread.java:61) at java.lang.Thread.run()V (Thread.java:829)
问题反馈与解决方案
这个问题在Vaadin社区已有其他开发者反馈,核心原因是Vaadin 23.2.x中ComboBox的数据更新逻辑导致PendingJavaScriptInvocation对象大量堆积未被及时清理,尤其在ComboBox频繁进行数据加载、过滤或滚动操作时更容易触发。
可通过以下方式解决:
- 升级至Vaadin 23.2.10及以上补丁版本,官方已修复该内存泄漏问题
- 优化ComboBox数据加载策略:启用分页加载、减少单次加载的数据量,避免频繁触发大量JS调用
- 组件卸载时手动清理:在UI销毁或ComboBox移除时,调用
UI.getCurrent().getPendingJavaScriptInvocations().clear()清理未完成的JS调用(注意线程安全) - 临时调整JVM内存参数缓解问题,但这仅为治标方案
内容的提问来源于stack exchange,提问作者gidravlic
相关产品推荐
相关产品推荐

