代码之家  ›  专栏  ›  技术社区  ›  Eric Belair

在API Json响应上循环时ColdFusion GC开销限制

  •  0
  • Eric Belair  · 技术社区  · 7 年前

    首先,我理解“GC开销限制”错误的一般含义。我在运行执行以下操作的脚本时收到此消息:

    1. 创建向外部API发出CFHTTP GET请求的对象的实例
    2. 将JSON响应(数组)存储为对象实例的属性(即VARIABLES.data)
    3. 使用 for in 环
    4. 在一个对象上创建一个实例,该实例调用传递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异常/内存泄漏。

    有改进的想法吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   John Sieber    7 年前

    我认为垃圾收集不会在一个请求中发生,即使是必要的。您可以增加内存,也可以将其拆分为多个线程来处理少量数据。