Coldfusion TemplateClassLoader держится за экземпляры загрузчика классов? - PullRequest
1 голос
/ 29 сентября 2011

У меня ошибка "OutOfMemoryError: PermGen space" на моем сервере CF 8. В моем приложении 1000 шаблонов были загружены в одну и ту же локальную переменную (для целей тестирования), поэтому после загрузки следующей должна быть доступна предыдущая для GC, но этого не происходит. Я получил дамп памяти и посмотрел на него с помощью jhat. Я увидел, что он загружает тысячи шаблонов, каждый со своими экземплярами TemplateClassLoader. В самом TemplateClassLoader есть статическая ссылка на все экземпляры TemplateClassLoader (опять же, из jhat). Вероятно, из-за этого экземпляры хранятся в памяти, поэтому объекты класса не могут быть GC в permgen.

Это «удержание памяти» происходит, только если я вызываю функцию cfscript в шаблоне после загрузки. Если я просто загружаю шаблон, но не вызываю функцию, объекты класса GCed, и ошибка OOM не возникает.

Есть идеи, что происходит с (появившейся) статической ссылкой на TemplateClassLoader?

1 Ответ

2 голосов
/ 04 октября 2011

Я понял это.На странице администрирования CF Настройки сервера> Кэширование есть поле «Максимальное количество кешируемых шаблонов».Он контролирует, сколько шаблонов должно быть в кеше LRU.Если шаблон находится в этом кэше, существует сильная ссылка на объект класса java, и он не может быть GCed.В моей настройке CF используется значение по умолчанию 1024. Вот почему в моем тесте 1000 уникальных шаблонов не получают GCed.

Здесь немного больше информации: http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/

...