Последствия памяти возврата запроса от CFC

Я записал сценарий загрузки базы данных в ColdFusion, и у меня есть проблема, что сценарий медленно исчерпывает память. Я разделил каждую загрузку таблицы на ее собственный поток с <cfthread>, и я называю сборщик "мусора", когда память опускается ниже 50% (удостоверяющийся иметь 30 секунд между gc (), звонит для предотвращения сборщика "мусора" от hogging памяти).

Я создал CFC для содержания всех запросов, необходимых сценарию. Сценарий вызывает соответствующую функцию CFC, которая затем возвращает запрос, некоторые из которых составляют более чем 2 МБ в размере. Когда я смотрю в Мониторе Сервера в представлении деталей Страницы памяти для Активных Потоков, похоже, что мой CFC сохраняет копию запроса в памяти даже при том, что я varscoped переменная запроса и переменная вышел из объема в конце функции. Кроме того, у меня есть копия запроса в памяти в моем потоке. Таким образом, меня оставляют с тем, что похоже на две копии запроса в памяти. Это действительно, что происходит? Если это, как я могу устранить одну копию запроса из памяти?

6
задан stomcavage 2 March 2010 в 16:18
поделиться

2 ответа

Здесь много потенциальных проблем, но я постараюсь выделить некоторые из наиболее важных вещей, которые вам следует рассмотреть:

  1. Почему потоки? Вам нужны нитки? Есть определенный момент, когда вы, вероятно, слишком много возитесь себе во благо.
  2. Принудительная сборка мусора вручную - не всегда хорошая идея. Настройте JVM на автоматическое выполнение сборки мусора, но не переусердствуйте. Сборка мусора, как правило, обходится дорого и может повлиять на производительность вашего приложения, если оно выполняется слишком часто.
  3. Как вы создаете экземпляр своего CFC? Если вы создаете экземпляр CFC при каждом запросе запроса, вы со временем столкнетесь с проблемами ОЗУ, медленной утечкой памяти, поскольку CFC загружаются в ОЗУ слишком быстро, чтобы сборка мусора не отставала. Лучше всего сделать это синглтоном. (т.е. установить его в области применения).
  4. Имейте в виду, что определение области видимости переменной не (насколько я понимаю) автоматически освобождает память, как только переменная перестает использоваться. Память по-прежнему зарезервирована, хотя, вероятно, она каким-то образом помечена как часть недолговечного поколения, чтобы (возможно?) Очистить ее быстрее. Но это ничего не гарантирует.
  5. Если вы просматриваете активные потоки, также возможно, что запрос не будет очищен до конца запроса - не обязательно до конца вызова функции. Кажется, нетерпение заставит вас ожидать, что запрос немедленно умрет, как только вызов функции будет завершен.
  6. Запросы ColdFusion передаются по ссылке , а не по значению.Невозможно получить 2 копии запроса в памяти, если только вы каким-то образом не используете duplicate () или аналогичную функцию для явного копирования запроса.

Запрос, скорее всего, возвращает указатель на запрос из вашего оператора cfreturn. Этот запрос не будет очищен до тех пор, пока все процессы не будут ссылаться на него. Поэтому, если он передаст запрос какому-либо другому процессу, вы не очистите память этого запроса. Если вы установите этот запрос для переменной сеанса, например, этот указатель никуда не денется, пока эта переменная сеанса не исчезнет, ​​независимо от того, как часто вы пытаетесь принудительно выполнить сборку мусора.

Вот несколько моментов, которые нужно учесть.

11
ответ дан 9 December 2019 в 22:32
поделиться

У меня возникла аналогичная проблема при обработке вставки больших данных, где каждая строка требует длительной обработки с использованием нескольких CFC. Оказалось, что ссылки JDBC ResultSet, Statement и Connection, созданные , сохраняются до конца запроса. Это означает, что обнуление переменной запроса не влияет на использование памяти. Я обошел эту проблему, сделав вызов шлюза к функции CFC для обработки 100 строк, затем эта функция делает еще один вызов шлюза для следующих 100 строк и т.д., пока все строки не будут обработаны. Поскольку каждый отдельный вызов шлюза фактически завершается, он освобождает все свои дескрипторы, и память восстанавливается.

0
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: