ColdFusion: рекурсия слишком глубокая; стек переполнен

Последние несколько лет мы случайно видели это сообщение в выходных журналах при выполнении запланированных задач в ColdFusion:

Слишком глубокая рекурсия; стек переполнен.

Код внутри вызываемой задачи может различаться, но в данном случае это ОЧЕНЬ простой код, который ничего не делает, только сбрасывает счетчик в базе данных, а затем отправляет мне электронное письмо, чтобы сообщить мне, что оно прошло успешно. Но я видел, как это происходит со всеми видами кода, поэтому я почти уверен, что это не тот код, который вызывает эту проблему.

В нем даже есть пустой application.cfm/cfc для блокировки любого другого вызываемого кода.

Единственный раз, когда мы видим это, мы перезапускаем CF и пытаемся просмотреть страницу до того, как служба полностью запустится.

Ошибка случается редко, но теперь у нас есть довольно важные запланированные задачи, которые вызывают проблемы, если они не запускаются. (Поэтому я выкладываю сюда для помощи)

Использование памяти в порядке. Задача, которая выполнялась как раз перед тем, как сообщить о более чем 80% свободной памяти. Мониторинг памяти в течение ночи не показывает никаких необычных всплесков. Машина имеет 4 гигабайта памяти и на ней больше ничего не работает, кроме ОС и CF. Недавно мы попытались переустановить CF, чтобы решить проблему, но это не помогло. Это происходит и на нескольких других наших серверах.

Это внутренний сервер, поэтому использование в 3 часа утра должно быть несуществующим. В это время нет других запланированных задач.

Мы видели это на наших коробках CF7, CF8 и CF9 (полностью исправлены).

Текущее поле в информации о вопросе:

  • CF версия: 9,0,1,274733
  • Издание: Предприятие
  • ОС: Windows 2003 Server
  • Версия Java: 1.6.0_17
  • Мин. Куча JVM: 1024
  • Макс. Куча JVM: 1024
  • Мин Пермь Размер: 64м
  • Макс Пермь Размер: 384м
  • Память сервера: 4 ГБ
  • Четырехъядерный компьютер, который редко видит загрузку процессора более 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>

Если я что-то пропустил, дайте мне знать. Спасибо!

3 ответа

Решение

У нас была эта проблема некоторое время после того, как наш сервер был обновлен до ColdFusion 9. Похоже, что исправление в этом техническом замечании от Adobe на jRun 4: http://kb2.adobe.com/cps/950/950218dc.html

Вы, вероятно, должны внести некоторые изменения в разрешения, как указано в техническом замечании.

Вы пытались уменьшить размер вашей кучи с 1024, чтобы сказать что-то 800. Вы говорите, что доступно более 80% памяти, поэтому, если возможно, я бы посмотрел на уменьшение макс.

Это 32 или 64 битная ОС? При назначении пространства кучи необходимо учитывать все издержки JVM (стек, библиотеки и т. Д.), Чтобы не превышать лимит ОС для процесса.

Вы можете установить минимальный размер кучи JVM равным максимальному размеру кучи JVM (МБ) с вашим администратором CF.

Также обновите JVM до последней (21) или как минимум 20.

В прошлом я всегда обновлял JVM всякий раз, когда начиналось что-то странное, потому что это обычно решало проблему.

Другие вопросы по тегам