奇怪的 Java .lang.StackOverflowError 错误

2 天前
 Geekerstar

使用的 undertow ,经常出现这个错误,一出现就打印很长的日志,一直找不到原因,没找到业务层的代码,求大佬帮忙看看。

这个是节选部分日志,完整的在这里:gitee.com/geekerstar/test/blob/master/sof.txt

2025-01-03 17:13:40.256 [ERROR] [XNIO-1 I/O-11] org.xnio.listener: [] XNIO001007: A channel event listener threw an exception
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.StackOverflowError
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:612)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:600)
	at io.undertow.websockets.jsr.FrameHandler.invokeTextHandler(FrameHandler.java:268)
	at io.undertow.websockets.jsr.FrameHandler.onFullTextMessage(FrameHandler.java:319)
	at io.undertow.websockets.core.AbstractReceiveListener$2.complete(AbstractReceiveListener.java:156)
	at io.undertow.websockets.core.AbstractReceiveListener$2.complete(AbstractReceiveListener.java:152)
	at io.undertow.websockets.core.BufferedTextMessage.read(BufferedTextMessage.java:105)
	at io.undertow.websockets.core.AbstractReceiveListener.readBufferedText(AbstractReceiveListener.java:152)
	at io.undertow.websockets.core.AbstractReceiveListener.bufferFullMessage(AbstractReceiveListener.java:90)
	at io.undertow.websockets.jsr.FrameHandler.onText(FrameHandler.java:184)
	at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:44)
	at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:33)
	at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
	at io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:959)
	at io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:939)
	at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
	at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
	at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
	at org.xnio.nio.WorkerThread.run(WorkerThread.java:591)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.StackOverflowError
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:612)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:600)
	at io.undertow.websockets.jsr.FrameHandler.invokeOnError(FrameHandler.java:121)
	at io.undertow.websockets.jsr.FrameHandler.access$100(FrameHandler.java:57)
	at io.undertow.websockets.jsr.FrameHandler$7.run(FrameHandler.java:294)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:170)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:167)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:610)
	... 18 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.StackOverflowError
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:612)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:600)
	at io.undertow.websockets.jsr.annotated.AnnotatedEndpoint.onError(AnnotatedEndpoint.java:224)
	at io.undertow.websockets.jsr.FrameHandler$2.run(FrameHandler.java:124)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:170)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:167)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:610)
	... 26 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.StackOverflowError
	at io.undertow.websockets.jsr.annotated.BoundMethod.invoke(BoundMethod.java:94)
	at io.undertow.websockets.jsr.annotated.AnnotatedEndpoint$5.run(AnnotatedEndpoint.java:229)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:170)
	at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:167)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:610)
	... 33 common frames omitted
Caused by: java.lang.StackOverflowError: null
951 次点击
所在节点    Java
9 条回复
Aruforce
2 天前
一般都是业务代码死递归了…堆栈没了是因为太多次异常 jvm 给吞了
vvtf
2 天前
websocket 的好像.
应该是代码有问题.
可能某个异常被递归监听或者处理之类的.
Aruforce
2 天前
还有自己的堆栈信息别四处乱贴…
vvtf
2 天前
看了下原日志, json 解析的 bug 吧.
Geekerstar
2 天前
@Aruforce #3 谢谢,贴之前已经检查了没有敏感信息。应该和 websocket 有关,但是没能定位到业务代码,不知道是不是和 undertow 有关。

@vvtf #2 json 解析的 bug 是指什么呢?框架的问题吗?
guyeu
2 天前
明显是业务代码的问题呀,`at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:612)` 这块调你业务代码的时候递归了,翻一下历史日志,服务器启动之后第一笔这个报错的 StackOverflow 的堆栈会打出来,或者启动的时候加`-XX:-OmitStackTraceInFastThrow`禁用堆栈优化,就可以看见完整堆栈了。
evan1
2 天前
看日志似乎是 json 解析的问题。

可以看下你们的 bean 有没有循环依赖?比如 ClassA 里面有个属性名为 fdParent ,类型也是 ClassA 之类的,然后 json 去序列化这个 class 了。

再比如 ClassA 里面有个属性是 ClassB 类型,ClassB 里面也有个属性是 ClassA 类型之类的。
litchinn
2 天前
你有个地方用了 bean copy 或者 json 解析,但是你的 bean 没有 getter 方法,你的堆栈说的是这个错
Geekerstar
2 天前
@Aruforce #1
@vvtf #2
@guyeu
@evan1
@litchinn 感谢各位大佬的指导和思路,应该是找到原因了,在 websocket 工具类中存在一个不必要的日志打印,其中将 session 转成 JSON 字符串了,不知道当时为什么这样写。应该就是这个 JSONUtil.toJsonStr(session));导致的,再次感谢各位指点。

```
log.error("[websocket]WebSocket 发生错误,SID 为:{},错误信息为:{},session:{}", sid, error.getMessage(), JSONUtil.toJsonStr(session));
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1102847

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX