stackoverflowerror原因(stackoverflow报错)
stackoverflowerror原因(stackoverflow报错),新营销网红网本栏目通过数据整理汇集了stackoverflowerror原因(stackoverflow报错)相关信息,下面一起看看。
序
有一天,我和业务方的一个同事反馈,说系统里出现了StackOverflowError。坦率地说,例外已经出现,但错误很少出现。这时,他的心情是这样的。
一波猛操作
我们先来看看血腥的犯罪现场。
从异常堆栈中可以明显看出存在一个无限循环。事实上,绝大多数StackOverflowError都是由无限循环和递归引起的。那么,为什么会有循环调用呢?我们根据溢出的犯罪现场检查源代码。
如果你用idea,他会用图标提示你,会有递归调用。
那么问题来了,这里到底为什么会有循环递归调用呢?因为这个问题,不可避免的会重现。对于之前查过我源代码分析的老粉丝来说简直太容易了。我们触发现场,然后在案发现场打断点,不断放。经过多次重复,如下图
以上数据之后,我们大致看到了无限循环的迹象。我们有针对性的货币和可用货币。为什么这里有重复的循环?让我们看看货币类的源代码。
1 public static set currency getavailablecurrences(){ 23//省略.4}结合断点序列化可以看出,currency在json序列化时,需要反序列化availableCurrencies。然后getavailableCurrencies()包含货币,从而陷入无限循环。
本地复制
为了保证每一个粉丝都能参与其中,飞巢挑选了最简单的必须重现的模型。希望飞巢微信官方账号的粉丝都能参与进来,而不是每次看完分析都有人喊“666”!
1 publicclassfeichaoto { 23 privatecurrencycurrency;45 publiccurrencygetcurrency(){ 6 return currency;7 } 89 publicvidsetcurrency(currency currency){ 10 this . currency=currency;11 } 12 } 1 @ test 2 publicvoidtest()throws exception { 3 feichaodtofeichaodto=newFeiChaoDTO();4 feichaodto . set currency(currency . getinstance( CNY ));5 string JSON=JSON . JSON(feichao dto);6 system . out . println(JSON);7}怎么解决?
很明显,这个问题的原因是该同学在Dubbo中使用了json序列化工具类。因为这个工具并不是Dubbo的主流功能,没有得到足够的重视,所以自然存在一些不完善的功能,Dubbo2.6.x之后的版本已经被标记为过期。,我们来看看阿里的开发手册。
解决这个问题的方法很简单。因为需要json序列化,所以使用主流的json序列化工具。不管用fastjson,gson,jackson怎么处理这些循环,还是那句话,本微信官方账号长期与各大搜索引擎合作,根据我的描述进行搜索,比如fastjson循环引用,你可以找到你想要的一切。,如果你小心的话,这些主流工具都不会序列化availableCurrencies字段。Dubbo的序列化工具的处理逻辑和主流的JSON工具有些不同。,没必要纠结。Dubbo本身的定位是RPC框架,就像飞巢微信官方账号的定位是源代码分析和真实场景源代码实战。我们可以从上面三个神器中选择一个进行JSON分析。
堆栈溢出
更多stackoverflowerror原因(stackoverflow报错)相关信息请关注本文章,本文仅仅做为展示!