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 всякий раз, когда начиналось что-то странное, потому что это обычно решало проблему.