Избегайте ошибок кучи при цикле в Coldfusion
Я пытаюсь перебрать 2-D
массив, размеры которого 12000 * 20
и я постоянно получаю java.lang.OutOfMemoryError.
Первоначально я думал, что это может быть из-за размера кучи, поэтому я увеличил размер кучи, но я все еще получал ту же ошибку. Итак, я запустил сборщик мусора так:
<cflock name="checkMemory" type="exclusive" timeout="1" throwontimeout="yes">
<cfset objSystem = CreateObject( "java", "java.lang.System" )>
<cfset objSystem.gc()>
</cflock>
и я сбросил свободную память, которая была вокруг 850MB
:
<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
<cfset freeMemory = runtime.freeMemory()>
<cfdump var="#freeMemory#" label="free">
Здесь я пытаюсь создать переменную XML и во время цикла я получаю ошибку кучи:
<cfxml variable="variables.XML">
<cfoutput>
<ROWS>
<cfloop from="3" to="#arrayLen(local.array)#" index="i" step="1">
<ROW>
<cfloop from="1" to="#arrayLen(local.array[2])#" index="j" step="1">
<#ucase(local.array[2][j])#>
<![CDATA[#trim(local.array[i][j])#]]>
</#ucase(local.array[2][j])#>
</cfloop>
</ROW>
</cfloop>
</ROWS>
</cfoutput>
</cfxml>
Это трассировка стека:
java.lang.OutOfMemoryError в java.io.WinNTFileSystem.getBooleanAttributes(собственный метод) в java.io.File.exists(File.java:733) в coldfusion.xml.XmlProcessor.getSourceURL(XmlProcessor.javaf24) xml.XmlProcessor.parse(XmlProcessor.java:155) по адресу coldfusion.tagext.lang.XmlTag.doEndTag(XmlTag.java:85) по адресу cffeeds2ecfc1003675922$funcDEMO1._factor8(C:\component\abc.cfccccccccccccccccccc):1235) Функция funcDEMO1.runFunction (C: \ component \ abc.cfc: 1192) в coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) в coldfusion.runtime.UDFMethod $ ReturnTypeFilter.invoke (UDFMethod5). runtime.UDFMethod $ ArgumentCollectionFilter.invoke (UDFMethod.java:368) в coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) в coldfusion.runtime.UDFMethod.runFilterCava.FD.Fun.FD.invoke (UDFMethod.java:220) в coldfusion.runtime.CfJspPage._invokeUDF (CfJspPage.java:2582) в cffeeds2ecfc1003675922 $ funcDEMO.runFunction(\component\abc.cfc:935) в coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) в coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) во время ColdFusion.Fol: (UDFMethod.java:368) в coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) в coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) в coldfusion.Metho.FD.FD:517) в coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:496) в coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:355) в coldfusion.filter.ComponentFilter.invoke(ComponentFilter.java:188) в coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:374) по адресу coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) по адресу coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) по адресу coldfusion.filter (PathFilter.java:94) at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) в coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) в coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter).GlobalsFilter.invoke(GlobalsFilter.java:38) в coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) в coldfusion.xml.rpc.CFCServlet.invoke(CFCServlet.java:139) в coldfusion.xFC в coldfusion.xFC.doPost(CFCServlet.java:290) в javax.servlet.http.HttpServlet.service(HttpServlet.java:760) в org.apache.axis.transport.http.AxisServletBase.service(AxisServletBax.jav: javasq: at.servlet.http.HttpServlet.service(HttpServlet.java:853) в coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) в jrun.servlet.FilterChain.doFilter(фильтр Chain.forg.jpg).filter.FusionReactorFilter.i(FusionReactorFilter.java:566) на com.intergral.fusionreactor.filter.FusionReactorFilter.c(FusionReactorFilter.java:258) в com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter(FusionReactorFilter.java:164) в jrun.servlet.FilterChain.doFilter(FilterChain.java:94) в coldfusion.monitor.event.MililterFerterFerterFort.java:42) в coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) в jrun.servlet.FilterChain.doFilter(FilterChain.java:94) в jrun.servlet.FilterChain.service(FilterChain.jin) по адресу jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) по адресу jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) по адресу jrun.servlet.JRunRequestDispatcher.in.jt.ServletEngineService.dispatch(ServletEngineService.java:543) в jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) в jrunx.scheduler.ThreadPool.jpg $ThreadThrottle.invokeRunnable(ThreadPool.java:428) в jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) в jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Есть ли лучшее решение, чтобы избежать зацикливания или устранить эту ошибку?
Я создал страницу cfm локально и добавил в нее некоторые переменные следующим образом:
<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
<cfset freeMemory = runtime.freeMemory()>
<cfset totalMemory = runtime.totalMemory()>
<cfset maxMemory = runtime.maxMemory()>
<cfdump var="#freeMemory#" label="free">
<cfdump var="#totalMemory#" label="total">
<cfdump var="#maxMemory#" label="max">
Каждый раз, когда я обновлял эту страницу, объем свободной памяти уменьшался, пока я не запустил GC. Я все еще пытаюсь понять, почему это происходит. Есть предложения на этот счет?
Пожалуйста помоги. Заранее спасибо.
1 ответ
После предложений Adam Cameron, Dan Bracuk и James Moberg Dan Bracuk я сделал следующее, и сейчас у меня не возникает куча ошибок. Я подозреваю, что это было из-за CFXML
тег, но не уверен.
Преобразование всех элементов array[2]
в верхний регистр:
<cfloop from="1" to="#arrayLen(local.array[2])#" index="i" step="1">
<cfset local.array[2][i] = ucase(local.array[2][i])>
</cfloop>
Затем с помощью cfsavecontent
создать строку XML:
<cfsavecontent variable="local.xmlString">
<?xml version="1.0" encoding="UTF-8"?>
<ROWS>
<cfoutput>
<cfloop from="3" to="#arrayLen(local.array)#" index="local.currentRow" step="1">
<ROW>
<cfloop from="1" to="#arrayLen(local.array[2])#" index="local.currentColumn" step="1">
<#local.array[2][local.currentColumn]#>
<![CDATA[#trim(local.array[local.currentRow][local.currentColumn])#]]>
</#local.array[2][local.currentColumn]#>
</cfloop>
</ROW>
</cfloop>
</cfoutput>
</ROWS>
</cfsavecontent>
<cfset local.xml = xmlParse(local.xmlString)>