首先,我理解“GC开销限制”错误的一般含义。我在运行执行以下操作的脚本时收到此消息:
-
创建向外部API发出CFHTTP GET请求的对象的实例
-
将JSON响应(数组)存储为对象实例的属性(即VARIABLES.data)
-
使用
for in
环
-
在一个对象上创建一个实例,该实例调用传递JSON对象属性的SQL Server存储过程(SQL存储过程根据对象密钥的记录执行并更新或插入)
调试输出显示SP调用需要3-12毫秒。
当我使用有限的数据集(~3000条记录)运行这个脚本时,它会运行到完成,而不会引发GC异常。
当我使用完整的数据集(~14000条记录)运行脚本时,会抛出GC异常。
以下是我的伪代码:
for (LOCAL.WidgetJson in VARIABLES.data) {
LOCAL.Widget=new Widget();
LOCAL.Widget
.save(argumentCollection=LOCAL.WidgetJson);
}
小装置。氟氯化碳:
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异常/内存泄漏。
有改进的想法吗?