Я записал сценарий загрузки базы данных в ColdFusion, и у меня есть проблема, что сценарий медленно исчерпывает память. Я разделил каждую загрузку таблицы на ее собственный поток с <cfthread>, и я называю сборщик "мусора", когда память опускается ниже 50% (удостоверяющийся иметь 30 секунд между gc (), звонит для предотвращения сборщика "мусора" от hogging памяти).
Я создал CFC для содержания всех запросов, необходимых сценарию. Сценарий вызывает соответствующую функцию CFC, которая затем возвращает запрос, некоторые из которых составляют более чем 2 МБ в размере. Когда я смотрю в Мониторе Сервера в представлении деталей Страницы памяти для Активных Потоков, похоже, что мой CFC сохраняет копию запроса в памяти даже при том, что я varscoped переменная запроса и переменная вышел из объема в конце функции. Кроме того, у меня есть копия запроса в памяти в моем потоке. Таким образом, меня оставляют с тем, что похоже на две копии запроса в памяти. Это действительно, что происходит? Если это, как я могу устранить одну копию запроса из памяти?
Здесь много потенциальных проблем, но я постараюсь выделить некоторые из наиболее важных вещей, которые вам следует рассмотреть:
Запрос, скорее всего, возвращает указатель на запрос из вашего оператора cfreturn. Этот запрос не будет очищен до тех пор, пока все процессы не будут ссылаться на него. Поэтому, если он передаст запрос какому-либо другому процессу, вы не очистите память этого запроса. Если вы установите этот запрос для переменной сеанса, например, этот указатель никуда не денется, пока эта переменная сеанса не исчезнет, независимо от того, как часто вы пытаетесь принудительно выполнить сборку мусора.
Вот несколько моментов, которые нужно учесть.
У меня возникла аналогичная проблема при обработке вставки больших данных, где каждая строка требует длительной обработки с использованием нескольких CFC. Оказалось, что ссылки JDBC ResultSet, Statement и Connection, созданные