В свое время у меня была теория о том, что создание экземпляров объектов по каждому запросу, а не их присутствие в области приложения, было огромным всплеском памяти. Поскольку мои знания ColdFusion возрастали с годами, я не думаю, что я действительно понимал, как CF занимается классами в "черном ящике" фреймворка CF, поэтому я собираюсь попросить об этом для исправления или подтверждения сообщества.
Я просто собираюсь выбросить то, что, как я думаю, происходит:
- CFC скомпилирован в класс, каждый метод внутри этого CFC компилируется в класс.
- Эти классы будут находиться в памяти (PermGen) и могут быть записаны на диск на основе настроек администратора CF.
- Когда создается новый объект или запрашивается шаблон, исходный код хэшируется и сравнивается с хешем, хранящимся в скомпилированном классе.
- Если есть совпадение, он будет использовать скомпилированный класс в памяти
- Если скомпилированный класс не существует, он будет компилироваться из источника
- Если скомпилированный класс существует, но хэш не соответствует, он будет перекомпилирован.
- В любом случае, когда вы включаете доверенный кеш, ColdFusion больше не будет использовать источник для проверки различий и будет продолжать использовать скомпилированный класс в памяти.
- Всякий раз, когда вы создаете новый объект, вы получаете новый указатель на скомпилированный класс и классы его методов, и любые события времени выполнения встречаются в псевдоконструкторе. Изменить:. В этот момент я имею в виду использование createObject и наличие какого-либо "свободного" кода вне функций. Когда я говорю указатель, я имею в виду ссылку на память, выделенную для областей объекта (это переменные, функциональные переменные).
- Если вы запрашиваете init, то запускается конструктор. Потребляемая память в этот момент - это только ваша новая ссылка и любые переменные, заданные в псевдоконструкторе и конструкторе. На самом деле вы не занимаете память для копии всего класса. Изменить:. Для этого шага я имею в виду использование нового оператора или привязку старой школы createObject(). init().
Это устраняет огромную ошибку, которую я, лично, мог слышать на протяжении многих лет, что создание больших объектов в каждом запросе представляет собой массивный всплеск памяти (из-за наличия копии класса, а не только ссылки). Пожалуйста, обратите внимание, что я не сторонник этого, одноэлементный образец поражает. Я просто пытаюсь подтвердить, что происходит под капотом, чтобы предотвратить преследование красных сельдей в устаревшем коде.
Изменить: спасибо за вход для всех, это был действительно полезный Q/A для меня.