Google App Engine中TaskQueue频繁超时是否会引发StackOverflowError?
TaskQueue频繁超时是否会引发StackOverflowError?
答案是肯定的,TaskQueue频繁超时确实可能间接导致StackOverflowError,具体原因可以从这几个角度理解:
- 首先,App Engine的TaskQueue自带重试机制:当任务因为超时(就像你日志里的
http method POST against URL http://127.0.0.1:8080/somepath timed out这种情况)执行失败时,系统默认会反复重试这个任务。 - 如果你的任务重试逻辑处理不当,比如在捕获超时异常后直接在当前方法内递归调用自身执行任务,每一次重试都会在JVM的调用栈里新增一层方法调用。次数多了,调用栈的深度就会超过JVM允许的上限,最终触发
StackOverflowError。 - 还有一种情况是,任务每次超时失败后,没有正确清理之前调用产生的栈帧,多次重试的栈帧累积起来,也会撑爆栈空间。
举个实际的例子:假设你的任务方法里写了类似这样的逻辑——捕获超时异常后,直接调用runTask()方法重新执行,那每重试一次,栈里就多一个runTask()的调用记录,几十上百次重试后,栈肯定就不够用了。
你现在看到的com.google.apphosting.api.ApiProxy$ApplicationException是超时的直接错误,但后续的重试逻辑如果有问题,就会连锁引发栈溢出的问题。
内容的提问来源于stack exchange,提问作者quarks
相关产品推荐
相关产品推荐

