Для начала я понимаю, что вообще означает ошибка «Ограничение накладных расходов GC». Я получил это сообщение во время выполнения скрипта, который выполняет следующее:
- Создание экземпляра объекта, который отправляет запрос CFHTTP GET на внешний API
- Сохранить ответ JSON (массив) как свойство объекта Instance (т.е. VARIABLES.data)
- Цикл по массиву ответов JSON с использованием
for in
loop
- Создание экземпляра для объекта, который вызывает хранимую процедуру SQL Server, передавая свойства объекта JSON (хранимая процедура SQL выполняет и UPDATE или INSERT, основываясь на существовании записи для ключа объекта)
Вывод отладки показывает, что вызов SP занимает от 3 до 12 миллисекунд.
Когда я запускаю этот сценарий с ограниченным набором данных (~ 3000 записей), он запускается до завершения без исключения GC.
Когда я запускаю сценарий с полным набором данных (~ 14 000 записей), генерируется исключение GC.
Вот мой псевдокод:
for (LOCAL.WidgetJson in VARIABLES.data) {
LOCAL.Widget=new Widget();
LOCAL.Widget
.save(argumentCollection=LOCAL.WidgetJson);
}
Widget.cfc:
private void function saveStoredProc() {
cfstoredproc(procedure="SaveWidget") {
cfprocparam(
dbvarname="@id",
type="in",
cfsqltype="CF_SQL_INT",
value=VARIABLES.id
);
<!--- Rest of cfprocparam() tags here --->
}
private void function save() {
for (LOCAL.Property in ARGUMENTS) {
if (StructKeyExists(ARGUMENTS, LOCAL.Property)) {
if (IsSimpleValue(ARGUMENTS[LOCAL.Property])) {
VARIABLES[LOCAL.Property] = Trim(ARGUMENTS[LOCAL.Property]);
}
else {
VARIABLES[LOCAL.Property] = ARGUMENTS[LOCAL.Property];
}
}
}
saveStoredProc();
}
Мне интересно, можно ли улучшить способ создания объектов или циклов, чтобы исключить GC-исключения / утечки памяти.
Есть идеи по улучшению?