Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks 在ColdFusion 8中生成缩略图时如何避免使用内存?_Memory Leaks_Coldfusion_Garbage Collection_Out Of Memory_Coldfusion 8 - Fatal编程技术网

Memory leaks 在ColdFusion 8中生成缩略图时如何避免使用内存?

Memory leaks 在ColdFusion 8中生成缩略图时如何避免使用内存?,memory-leaks,coldfusion,garbage-collection,out-of-memory,coldfusion-8,Memory Leaks,Coldfusion,Garbage Collection,Out Of Memory,Coldfusion 8,我使用以下函数循环浏览PDF文件目录,并为每个文件创建缩略图: <cffunction name="createThumbnails" returntype="Void" output="false"> <cfscript> // CONSTANTs var _PDF_PATH = APPLICATION.PDFSource & "\PDFs"; // Set defaults for private

我使用以下函数循环浏览PDF文件目录,并为每个文件创建缩略图:

<cffunction name="createThumbnails" returntype="Void" output="false">
    <cfscript>
        //  CONSTANTs
        var _PDF_PATH = APPLICATION.PDFSource & "\PDFs";

        //  Set defaults for private variables
        var _qPDFDir = QueryNew("");
        var _documentId = 0;
        var _sourceFilePath = "";
        var _sku = "";
        var _tempImageFilePath = "";
    </cfscript>

    <!--- Retrieve a list of file names in the directory of unprocessed PDF files --->
    <cfdirectory
        action="list"
        directory="#_PDF_PATH#"
        name="_qPDFDir"
        filter="*.pdf"
        type="file"
        sort="datelastmodified DESC"
        listinfo="name" />

    <!--- Loop through the list of file names in the directory of unprocessed non-PDF files --->
    <cfloop query="_qPDFDir" endrow="500">
        <cfset _sourceFilePath = _PDF_PATH & "\" & name />

        <cfif FileExists(_sourceFilePath) AND IsPDFFile(_sourceFilePath)>
            <cftry>
                <cfpdf
                    action="thumbnail"
                    source="#_sourceFilePath#"
                    destination="#APPLICATION.TempDir#"
                    format="png"
                    scale="100"
                    resolution="high"
                    overwrite="true"
                    pages="1" />

                <cfcatch>
                    <cfscript>
                        FileMove(
                            _sourceFilePath,
                            _PDF_PATH & "\NonFunctioning\"
                            );
                    </cfscript>
               </cfcatch>
            </cftry>

            <cfscript>
                _documentId =
                    REQUEST.UDFLib.File.getFileNameWithoutExtension(name);
                _tempImageFilePath =
                        APPLICATION.TempDir
                    &   "\"
                    &   _documentId
                    &   "_page_1.png";

                if  (FileExists(_tempImageFilePath)) {
                    _sku = getSkuFromDocumentId(_documentId);

                    if  (Len(_sku)) {
                        CreateObject(
                            "component",
                            "cfc.products.Product"
                            ).setClientId(
                                getClientId()
                                ).setId(
                                    _sku
                                    ).createThumbnails(
                                        sourcePath = _tempImageFilePath,
                                        deleteSourceFile = true
                                        );

                        FileMove(
                            _sourceFilePath,
                            APPLICATION.ProcessedPDFDir
                            );
                    }
                }
            </cfscript>
        </cfif>
    </cfloop>

    <cfreturn />
</cffunction>
有些代码不是我想做的-例如,将文件移动到不起作用的目录,但这是业务规则所要求的

我想弄明白的是,当这个函数运行时,如何避免使用内存

当endrow=500时,它被java.lang.OutOfMemoryError搞砸了:GC开销限制在处理了大约148个文件后超过了错误

当我在任务管理器窗口中查看jrun.exe进程时,我可以看到内存不断增加


是否有任何方法可以提高此函数的性能,以防止内存被占用?

如果在循环中创建对象,每次创建对象时,CF将保留内存,直到页面完成运行,然后释放内存

在循环外实例化对象,并将其保存在变量中 并重新使用循环中的对象。 不要像steve建议的那样在一个过程中处理所有文件,然后创建一个新的请求(例如cfhttp)并再次调用处理页面,这将释放第一个过程中使用的所有内存。
看起来您的VM在收集内存方面花费了太多时间:。“超出GC开销限制”消息告诉您执行完整GC花费的时间太长,不一定会完全耗尽内存。您是否在CF实例上配置了GC日志记录?我将其设置为每秒运行一次并检查日志。使用GCViewer可视化日志:此函数是否使用此行调用自身。createThumbnails如果是这样的话,你可能会有一个无限循环。你能在函数外执行cfdirectory并将目录/文件名传递给它吗。然后在主脚本中,让您的cfdirectory一次运行50个文件,然后通过cflocation或javascript刷新重定向回自身,直到它处理完文件夹中的所有内容。看起来,一旦完成PDF,您会将其移动到已处理的文件夹中吗?因此,如果一个文件夹中有500个文件,一次运行50个,那么10次就可以了。当您的cfdirectory停止返回结果时,添加一个cfabort。@不,它正在调用另一个对象中的函数。@BANYR谢谢。好主意。我会调查的。