今天遇到一个很有意思的bug,当程序开发完成后打包到服务器运行,总是会出现栈溢出异常,经过排查发现,问题出现在一个接口上,但这个接口逻辑并不复杂,除了几局逻辑代码外和打印语句之外也没有其他的了,但是只要调用这个接口就马上会出现栈溢出的异常,随后对代码进行了排查,最后发现问题居然出现在日志打印语句上。

平常在开发过程中我们经过会通知打印日志来了解程序的运行状态,没想到今天在这上面翻了车,这个打印语句是打印一个对象,我们知道,当要打印一个对象的时候会自动调用对象的toString()方法,项目中我们会使用lombok插件来帮助我们生成对应的get、set、equals、hashcode、toString等方法,而打印的这个对象在由Spring容器管理的一个bean,我们给这个bean取名A,在A里面又依赖注入了另一个bean,我们取名B,A和B形成了循环依赖,且都重写了toString方法,所以当调用A的toString方法时,会调用B的toString方法,当调用B的toString又会调用A的toString,由此形成了死循环,最终导致了栈溢出的异常。

下面是我精简出的出现问题的代码结构,帮助大家避坑

类A结构

public class A {

    private B b;

    public B getB() {
return b;
} public void setB(B b) {
this.b = b;
} @Override
public String toString() {
return "A{" +
"b=" + b +
'}';
}
}

类B结构

public class B {

    private A a;

    public A getA() {
return a;
} public void setA(A a) {
this.a = a;
} @Override
public String toString() {
return "B{" +
"a=" + a +
'}';
}
}

Spring配置文件,类A类B交给容器管理

<bean id="a" class="com.zlm.bean.A">
<property name="b" ref="b"/>
</bean>
<bean id="b" class="com.zlm.bean.B">
<property name="a" ref="a"/>
</bean>

主程序

public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext xmlApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
A bean = xmlApplicationContext.getBean(A.class);
// 会报错
System.out.println(bean);
}
}

错误信息

Exception in thread "main" java.lang.StackOverflowError

有趣的BUG之Stack Overflow的更多相关文章

  1. 为什么开发者热衷在Stack Overflow上查阅API文档?

    摘要:一项新研究跟踪了Android开发者的访问历史,发现开发者多达二分之一的文档是从Stack Overflow上获取到的,而Stack Overflow上的示例也多于官方指南,开发者通过搜索更多时 ...

  2. Stack Overflow是如何做应用缓存的

    首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...

  3. Stack Overflow: The Architecture - 2016 Edition(Translation)

    原文: https://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 作者:Nick Cra ...

  4. 推荐一个网站Stack Overflow

    网站URL:http://stackoverflow.com 我是怎么知道这个网站的呢?其实这个网站非常出名的,相信许多人都知道.如果你不知道,请继续阅读: 一次我在CSDN上面提问,但是想要再问多几 ...

  5. 转:Stack Overflow通过关注性能,实现单块应用架构的扩展能力

    原文来自于:http://www.infoq.com/cn/news/2015/07/scaling-stack-overflow 在New York QCon 2015大会上,David Fulle ...

  6. zt (stack overflow 介绍)

    这是「解密 Stack Overflow 架构」系列的第一篇,本系列会有非常多的内容.欢迎阅读并保持关注. 为了便于理解本文涉及到的东西到底都干些了什么,让我先从 Stack Overflow 每天平 ...

  7. 【转】Stack Overflow研发副总裁:.NET技术并不差,合适自己就好

    摘要:在QCon纽约大会上, Stack Exchange的工程部副总裁David Fullerton深入解析了如何使用C#.MS SQL等技术支撑Stack Overflow网站的单块应用架构,这个 ...

  8. 重学计算机组成原理(六)- 函数调用怎么突然Stack Overflow了!

    用Google搜异常信息,肯定都访问过Stack Overflow网站 全球最大的程序员问答网站,名字来自于一个常见的报错,就是栈溢出(stack overflow) 从函数调用开始,在计算机指令层面 ...

  9. Stack Overflow 上 250W 浏览量的一个问题:你对象丢了

    在逛 Stack Overflow 的时候,发现最火的问题竟然是:什么是 NullPointerException(java.lang.NullPointerException),它是由什么原因导致的 ...

随机推荐

  1. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  2. Hadoop本地编写的jar包放到集群执行时报错处理

    错误描述: 020-03-24 22:45:23,204 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor ...

  3. C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

    --概述 这个项目演示了如何在WPF中使用各种Prism功能的示例.如果您刚刚开始使用Prism,建议您从第一个示例开始,按顺序从列表中开始.每个示例都基于前一个示例的概念. 此项目平台框架:.NET ...

  4. webpack打包学习

    从上图我们可以看出,webpack 可以将多种静态资源 js.css.sass文件等转换成一个静态文件,以此可以减少页面的请求,从而提高浏览器响应速度 1.安装开发依赖包 npm install we ...

  5. FSB—QPI—DMI总线的发展

    intel CPU有的是前端总线(FSB),有的是QPI总线,有的又是DMI总线 FSB总线(由于cpu的发展,fsb总线制约了cpu的发展,所以该总线已经渐渐淡出历史舞台) FSB即Front Si ...

  6. JavaWeb学习day7-Response初学4

    重定向和转发的区别 相同 页面都会实现跳转 不同 请求转发的时候url不会发生变化,编码是307 重定向的时候url会变化,编码是302

  7. JS将某个数组分割为N个对象一组(如,两两一组,三三一组等)

    方法一: var result = []; var data = [ {name:'chen',age:'25'}, {name:'chen',age:'25'}, {name:'chen',age: ...

  8. redis在物理机部署模式下如何进行资源[cpu、网卡]隔离

    上周末晚上运营做直播,业务代码不规范,访问1个redis竟然把1台服务器的网卡打满了,这台服务器上的其他redis服务都受到了影响.之前没有做这方面的预案,当时又没有空闲的机器可以迁移,在当时一点办法 ...

  9. JavaScript学习基础2

    ##JavaScript基本对象 1 .function:函数(方法)对象 * 创建: 1.var fun =new Function(形式参数,方法体): 2.function 方法名(参数){ 方 ...

  10. transition 动画过渡

    1. html 结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...