在过去的几年里,我们在 ColdFusion 中运行计划任务时,在输出日志中随机看到此消息:
递归太深;堆栈溢出。
正在调用的任务中的代码可能会有所不同,但在这种情况下,它是非常简单的代码,除了重置数据库中的计数器,然后给我发送电子邮件告诉我它成功之外什么都不做。但是我已经看到各种代码都会发生这种情况,所以我很确定不是代码导致了这个问题。
它甚至有一个空的 application.cfm/cfc 来阻止任何其他被调用的代码。
我们唯一一次看到这种情况是在我们重新启动 CF 并且我们试图在服务完全启动之前查看页面时。
该错误很少发生,但现在我们有一些相当关键的计划任务,如果它们不运行会导致问题。(因此我在这里发帖寻求帮助)
内存使用没问题。在它报告超过 80% 的可用内存之前运行的任务。整夜监控内存不会显示任何异常峰值。这台机器有 4 gigs 的内存,除了操作系统和 CF 之外没有其他东西在上面运行。我们最近尝试重新安装 CF 来解决问题,但没有帮助。它也发生在我们的其他几台服务器上。
这是一个内部服务器,所以凌晨 3 点的使用应该是不存在的。当时没有其他计划任务正在运行。
我们已经在我们的 CF7、CF8 和 CF9 盒子(完全修补)上看到了这一点。
当前有问题的框信息:
- CF版:9,0,1,274733
- 版本:企业
- 操作系统:Windows 2003 服务器
- Java版本:1.6.0_17
- 最小 JVM 堆:1024
- 最大 JVM 堆:1024
- 最小烫发尺寸:64m
- 最大烫发尺寸:384m
- 服务器内存:4GB
- CPU 使用率很少超过 5% 的四核机器
JVM设置:
-server -Dsun.io.useCanonCaches=false -XX:PermSize=64m -XX:MaxPermSize=384m -XX:+UseParallelGC -XX:+AggressiveHeap -Dcoldfusion.rootDir={application.home}/../ -Dcoldfusion.libPath ={application.home}/../lib -Doracle.jdbc.V8Compatible=true
这是昨晚未能运行但已经运行多年的令人难以置信的复杂代码,并且很可能明天会运行:
<cfquery datasource="common_app">
update import_counters
set current_count = 0
</cfquery>
<cfmail subject="Counters reset" to="my@email.com" from="my@email.com"></cfmail>
如果我错过了什么,请告诉我。 谢谢!