Coldfusion 冷融合:递归太深;堆满了水

Coldfusion 冷融合:递归太深;堆满了水,coldfusion,scheduled-tasks,coldfusion-9,Coldfusion,Scheduled Tasks,Coldfusion 9,在过去几年中,在ColdFusion中运行计划任务时,我们在输出日志中随机看到以下消息: 递归太深;堆栈溢出。 正在调用的任务中的代码可能会有所不同,但在本例中,这是一个非常简单的代码,它只会重置数据库中的计数器,然后向我发送电子邮件,告诉我它成功了。但是我见过各种代码都会出现这种情况,所以我很确定不是代码导致了这个问题 它甚至有一个空的application.cfm/cfc来阻止任何其他被调用的代码 我们看到这一情况的唯一其他时间是当我们重新启动CF,并试图在服务完全启动之前查看页面时 错误很

在过去几年中,在ColdFusion中运行计划任务时,我们在输出日志中随机看到以下消息:

递归太深;堆栈溢出。

正在调用的任务中的代码可能会有所不同,但在本例中,这是一个非常简单的代码,它只会重置数据库中的计数器,然后向我发送电子邮件,告诉我它成功了。但是我见过各种代码都会出现这种情况,所以我很确定不是代码导致了这个问题

它甚至有一个空的application.cfm/cfc来阻止任何其他被调用的代码

我们看到这一情况的唯一其他时间是当我们重新启动CF,并试图在服务完全启动之前查看页面时

错误很少发生,但现在我们有一些非常关键的计划任务,如果它们不运行,就会导致问题。(因此我在这里发帖寻求帮助)

内存使用情况良好。在报告超过80%的可用内存之前运行的任务。彻夜监控记忆不会出现任何异常的峰值。这台机器有4 Gig内存,除了操作系统和CF之外,没有其他东西在上面运行。我们最近试图重新安装CF来解决这个问题,但没有任何帮助。它也发生在我们的其他几个服务器上

这是一个内部服务器,所以凌晨3点的使用应该不存在。此时没有正在运行的其他计划任务

我们已经在CF7、CF8和CF9盒(完全修补)上看到了这一点

有问题的当前框信息:

  • CF版本:9,0,1274733
  • 版本:企业版
  • 操作系统:Windows 2003服务器
  • Java版本:1.6.0_17
  • 最小JVM堆:1024
  • 最大JVM堆:1024
  • 最小烫发尺寸:64m
  • 最大烫发尺寸:384m
  • 服务器内存:4gb
  • 四核机器很少看到超过5%的CPU使用率
JVM设置:

-server-Dsun.io.useCanonCaches=false-XX:PermSize=64m-XX:MaxPermSize=384m-XX:+usepallelgc-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>

更新导入计数器
设置当前计数=0

如果我错过了什么,请告诉我谢谢

在服务器升级到ColdFusion 9之后,我们有一段时间遇到了这个问题。修复程序似乎出现在jRun 4上Adobe的技术说明中:


您可能需要对技术说明中提到的权限进行一些调整。

在服务器升级到ColdFusion 9后,我们有一段时间遇到了这个问题。修复程序似乎出现在jRun 4上Adobe的技术说明中:


您可能需要按照技术说明中的说明对权限进行一些调整。

您可以尝试的是在CF管理员中将最小JVM堆大小设置为与最大JVM堆大小(MB)相同

还要将JVM更新到最新版本(21)或至少20


过去,每当出现异常情况时,我总是升级JVM,因为这通常可以解决问题。

您可以尝试使用CF管理员将最小JVM堆大小设置为与最大JVM堆大小(MB)相同

还要将JVM更新到最新版本(21)或至少20


过去,每当出现异常情况时,我总是升级JVM,因为这通常可以解决问题。

您是否尝试过将堆大小从1024个减少到800个左右。你说有超过80%的内存可用,所以如果可能的话,我会考虑减少最大内存


它是32位还是64位操作系统?在分配堆空间时,您必须考虑JVM的所有开销(堆栈、库等),以便不超过进程的操作系统限制。

您是否尝试过将堆的大小从1024减少到800左右。你说有超过80%的内存可用,所以如果可能的话,我会考虑减少最大内存


它是32位还是64位操作系统?在分配堆空间时,您必须考虑JVM的所有开销(堆栈、库等),以便不超过进程的操作系统限制。

您调用的代码是什么?正如我上面提到的,它是各种代码(因此我怀疑这是什么),但我编辑了我的问题,并将代码放在底部供您查看。谢谢这是在什么情况下发生的?它只是按照一天一次的时间表运行,还是每x分钟一次,等等?你在日志中有它的堆栈转储吗?@Ben:它每天运行一次,在凌晨3点@jfrobishow:没有。我前一段时间试图让它制作一个,但由于某种原因无法让它工作-不记得为什么了。我会再看一遍。你要调用的代码是什么?就像我上面提到的,它是各种各样的代码(所以我怀疑是这样),但我编辑了我的问题,并将代码放在底部供你查看。谢谢这是在什么情况下发生的?它只是按照一天一次的时间表运行,还是每x分钟一次,等等?你在日志中有它的堆栈转储吗?@Ben:它每天运行一次,在凌晨3点@jfrobishow:没有。我前一段时间试图让它制作一个,但由于某种原因无法让它工作-不记得为什么了。我会再调查的。谢谢你的评论。这也是我们最初的想法,但这意味着它永远不应该运行。由于它99%的时间都在运行,因此不会出现权限问题。只需检查运行CF的帐户,并按照文章中的建议进行设置。谢谢你的建议!我不确定这是否是每个遇到这个问题的人的解决方案,但这就是我们为解决这个问题所做的。我们设置了a中列出的所有权限