2010-09-03 86 views
1

在过去的几年中,我们在ColdFusion中运行计划任务时,随机在输出日志中看到此消息:ColdFusion:递归太深;堆栈溢出

递归太深;堆栈溢出。

被调用的任务内部的代码可能会有所不同,但在这种情况下,它非常简单,只需重置数据库中的计数器,然后向我发送一封电子邮件,告诉我它已成功。但我已经看到它与各种代码发生,所以我非常确定这不是导致此问题的代码。

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

我们唯一看到的是当我们重新启动CF时,我们试图在服务完全启动之前查看页面。

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

内存使用情况良好。在它报告超过80%空闲内存之前运行的任务。整夜监控内存不会显示任何非正常的峰值。该机器有4个内存的演出,没有其他任何运行,但操作系统和CF.我们最近试图重新安装CF来解决问题,但它没有帮助。它也发生在我们的其他几台服务器上。

这是一个内部服务器,所以在凌晨3点使用应该不存在。当时没有其他计划任务正在运行。我们已经在我们的CF7,CF8和CF9盒子上看到了这个(已完全修补)。

有关信息当前框:

  • CF版本:9,0,1,274733
  • 版:企业
  • 操作系统:Windows 2003服务器
  • Java版本:1.6 .0_17
  • 最小JVM堆:1024
  • 最大JVM堆:1024
  • 敏彼尔姆大小:64M
  • 最大烫发大小:384米
  • 服务器内存:4GB
  • 四核的机器,很少看到超过5%的CPU使用率

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 =真

这是令人难以置信的复杂的代码无法运行昨晚,但已经运行了多年,并且将最有可能运行的明天:

<cfquery datasource="common_app"> 
    update import_counters 
    set current_count = 0 
</cfquery> 

<cfmail subject="Counters reset" to="[email protected]" from="[email protected]"></cfmail> 

如果我错过了什么让我知道。 谢谢!

+0

你打电话的代码是什么? – 2010-09-03 15:27:57

+0

就像我上面提到的那样,它是各种代码(所以我对此表示怀疑),但是我编辑了我的问题并将代码放在底部供您查看。谢谢! – BigWorld 2010-09-03 16:04:46

+0

这起火灾的情况是什么?它是以一天一次的时间表还是每x分钟等等运行? – 2010-09-03 17:03:36

回答

1

我们有这个问题了,而我们的服务器升级到的ColdFusion 9.修复似乎是来自Adobe的技术在JRUN后4:http://kb2.adobe.com/cps/950/950218dc.html

你可能需要做一些调整的权限在技​​术说明中指出。

+0

感谢您的评论。这也是我们最初的想法,但这意味着它永远不会运行。由于它运行99%的时间,这不会是一个权限问题。 – BigWorld 2010-09-03 15:59:41

+0

刚刚检查了CF正在运行的帐户,并按照该文章中的建议进行设置。尽管谢谢你的建议! – BigWorld 2010-09-03 16:10:20

+0

我不确定这是否会成为解决所有遇到此问题的每个人的解决方案,但这是我们解决它的方法。我们拥有上文提到的丹尼文章中列出的所有权限,但是一旦我们删除了所有权限并将其重置为备份,我们再也没有看到过这个问题。我们在另一台服务器上对其进行了测试,结果发现存在问题,并在当前解决了问题。因此,即使您的设置APPEAR正确,请尝试将其清除并重置。我不知道为什么它有时会被允许运行,而不是其他的......这仍然是一个谜。 – BigWorld 2010-10-29 20:13:23

0

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

而且更新JVM到最新版本(21),或至少20

在过去,我一直升级JVM每当一些古怪开始发生的,通常解决了这个问题。

+0

我认为他已经按他的帖子做了最小/最大值 - 最小JVM堆:1024,最大JVM堆:1024.更新JVM是个好主意,但很少受到小修改的伤害。 – jfrobishow 2010-09-03 17:22:18

+0

我会更新到最新版本并回报。这可能需要一段时间,因为我不能强迫这个问题发生 - 它只是等待可能发生的更糟的时间,因为它有它自己的时间表。 ;)谢谢 – BigWorld 2010-09-03 18:53:49

0

你有没有试过把你的堆的大小从1024减少到800呢。你说有超过80%的内存可用,所以如果可能的话,我会考虑减少最大值。

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

+0

设置曾经是256/768。我们通过推荐人认为它可以解决这个问题,将它们都提高到了1024。但它也发生在那个旧的环境中。 它是一个32位操作系统,在64位内部运行,作为虚拟机。据它可以说,它是32位。这台机器有4个内存(不是所有的内存都可以在32位内存环境中使用),这就是为什么我们将它限制在1GB和384MB,并且这会为操作系统本身留下足够的空间。 正确的,在运行时它拥有大约80%的可用内存,但它不像整天那样 - 只是在夜晚。 – BigWorld 2010-09-03 18:56:47

+0

如果@ rip747更新到最新jvm的建议不起作用,您可以随时尝试使用请求大小,因为它们位于堆栈上。 -Xss {size} {unit}像-Xss64k。在32位Windows上默认为320K,64k是最小的可能......所以可能会降低一点,因为错误提示堆栈溢出。这是远远不够的,但由于你已经有这个问题多年,它可能是值得一试。 – jfrobishow 2010-09-03 19:32:15