1

在过去的几年里,我们在 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>

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

4

3 回答 3

1

在我们的服务器升级到 ColdFusion 9 后,我们有一段时间遇到了这个问题。修复似乎在 Adob​​e 在 jRun 4 上的这个技术说明中:http: //kb2.adobe.com/cps/950/950218dc.html

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

于 2010-09-03T15:45:28.863 回答
0

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

还将 JVM 更新到最新的 (21) 或至少 20。

过去,每当发生古怪的事情时,我总是升级 JVM,因为这通常可以解决问题。

于 2010-09-03T17:14:12.993 回答
0

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

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

于 2010-09-03T17:21:15.317 回答