记录一次StackOverflowError解决思路

申明:仅说明排除过程和解决思路哦,代码比较复杂,而且这种情况代码参考价值不大,思路可能有一些参考价值。

前言 :什么是StackOverflowError?

我们看一下维基百科是怎么解释的呢?
Stack overflow
In software, a stack overflow occurs if the call stack pointer exceeds the stack bound. The call stack may consist of a limited amount of address space, often determined at the start of the program. The size of the call stack depends on many factors, including the programming language, machine architecture, multi-threading, and amount of available memory. When a program attempts to use more space than is available on the call stack (that is, when it attempts to access memory beyond the call stack’s bounds, which is essentially a buffer overflow), the stack is said to overflow, typically resulting in a program crash。(在软件中,如果调用堆栈指针超出堆栈界限,就会发生堆栈溢出。调用堆栈可能包含有限数量的地址空间,通常在程序开始时确定。调用堆栈的大小取决于许多因素,包括编程语言、机器体系结构、多线程和可用内存量。当程序尝试使用比调用堆栈上的可用空间更多的空间时(即,当它尝试访问超出调用堆栈边界的内存时,这本质上是缓冲区溢出),则称堆栈溢出,通常会导致程序崩溃。)

简单了解一下之后,看看我遇到的问题。

1.出现问题

公司有个项目用到了Activiti 工作流,有一天同事在查询某一项流程的审批历史时候,就出现了StackOverflowError的问题。

2.问题排查

出现问题的地方是 查询审批历史的接口,我跟代码时候发现里面是一个递归,但是呢,代码写的有一些问题,可能出现以下情况:

  1. 死循环
  2. 由于是递归,当审批流程足够负责,就会出现栈溢出的情况
  3. 还有其他各种问题,但是跟题目不相关,忽略 哈哈哈哈

3.处理思路

  1. 死循环的地方那肯定要解决的。
  2. 对于递归这块逻辑,审批流程如果复杂,那可能会出现问题,我用的方法是用迭代的方式去替换递归,我用了deque (double ended queue)双端队列 来实现迭代。这样可以避免在调用栈上不断累积方法调用,从而减少了堆栈溢出的风险。

这个确实仅仅是记录一下。比较水,哈哈哈哈。 这篇就水一下,后面的文章用心写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书语时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值