I am trying to iterate over a 2-D array whose dimensions are 12000 * 20 , and I constantly get java.lang.OutOfMemoryError.
Initially, I thought it might be due to the heap size, so I increased the heap size, but I was still getting the same error. So I launched the garbage collector, for example:
<cflock name="checkMemory" type="exclusive" timeout="1" throwontimeout="yes"> <cfset objSystem = CreateObject( "java", "java.lang.System" )> <cfset objSystem.gc()> </cflock>
and I dumped the free memory that was around 850MB :
<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()> <cfset freeMemory = runtime.freeMemory()> <cfdump var="#freeMemory#" label="free">
Here I am trying to create an XML variable and during the loop I get a heap error:
<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>
This is the stack trace:
java.lang.OutOfMemoryError at java.io.WinNTFileSystem.getBooleanAttributes (native method) in java.io.File.exists (File.java:733) in coldfusion.xml.XmlProcessor.getSourceURL (XmlProcessor.java:246) in cold xml.XmlProcessor.parse (XmlProcessor.java:155) in coldfusion.tagext.lang.XmlTag.doEndTag (XmlTag.java:85) with cffeeds2ecfc1003675922 $ funcDEMO1._factor8 (C: \ component \ abc.cfc: 1235922 in cfc: 1235922) funcDEMO1.runFunction (C: \ component \ abc.cfc: 1192) at coldfusion.runtime.UDFMethod.invoke (UDFMethod.javarige72) at coldfusion.runtime.UDFMethod $ ReturnTypeFilter.invoke (UDFMethod.java:405). runtime.UDFMethod $ ArgumentCollectionFilter.invoke (UDFMethod.javahaps68) in coldfusion.filter.FunctionAccessFilter.invoke (FunctionAccessFilter.java:55) at coldfusion.runtime.UDFMethod.runFilterChain (UDFMethodjava atl .invoke (UDFMethod.java:220) at coldfusion.runtime.CfJspPage._invokeUDF (CfJspPage.java:2582 ) at cffeeds2ecfc1003675922 $ funcDEMO.runFunction (\ component \ abc.cfc: 935) at coldfusion.runtime.UDFMethod.invoke (UDFMethod.java:472) at coldfusion.runtime.UDFMethod $ ReturnTypeFilter.invoke.DavaFDF coldfusion.runtime.UDFMethod $ ArgumentCollectionFilter.invoke (UDFMethod.javahaps68) in coldfusion.filter.FunctionAccessFilter.invoke (FunctionAccessFilter.java:55) at coldfusion.runtime.UDFMethod.runFilterChain (UDfmentod1) .UDFMethod.invoke (UDFMethod.java∗17) at coldfusion.runtime.TemplateProxy.invoke (TemplateProxy.java:496) in coldfusion.runtime.TemplateProxy.invoke (TemplateProxy.javahaps55) in coldfusion.filter.ComponentFilter.invoke ( ComponentFilter.java:188) in coldfusion.filter.ApplicationFilter.invoke (ApplicationFilter.java{74) in coldfusion.filter.RequestMonitorFilter.invoke (RequestMonitorFilter.java:48) at coldfusion.filter.MonitoringFilter.invokeFilter ) at coldfusion.filter.PathFilter.invoke (PathFilter.java:94) in coldfusi on.filter.ExceptionFilter.invoke (ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke (ClientScopePersistenceFilter.java:28) at coldfusion.filter.BrowserFilter.invoke (BrowserFilter.java.filtero .invoke (NoCacheFilter.java:46) in coldfusion.filter.GlobalsFilter.invoke (GlobalsFilter.java:38) in coldfusion.filter.DatasourceFilter.invoke (DatasourceFilter.java:22) in coldfusion.xml.rpc.CFCServlet.v CFCServlet.java:139) at coldfusion.xml.rpc.CFCServlet.doPost (CFCServlet.java:290) at Level higher: org.apache.axis.transport.http.AxisServletBase.service (AxisServletBase.java:327) in javax.s .http.HttpServlet.service (HttpServlet.java:853) in coldfusion.bootstrap.BootstrapServlet.service (BootstrapServlet.java:89) in jrun.servlet.FilterChain.doFilter (FilterChain.java:86) in com.intergral.freact. filter.FusionReactorFilter.i (FusionReactorFilter.java►66) in com.intergral.fusionreactor.filter.FusionReactorFilter.c (Fusi onReactorFilter.java:258) in com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter (FusionReactorFilter.java:164) in jrun.servlet.FilterChain.doFilter (FilterChain.java:94) in coldfusion.monitoring.SventFterterter.terilter.doilter.terilter.doilter.terilter.doilterter.terilter.doilter.terilter.terilter.terilter.terilter.terilter.doilter.terilter.ventilter.doilter.terilter.ventilter.doilter.terilter.doilter.terilter.doilter.terilter.doilter.terilter.dolerter (MonitoringServletFilter.java:42) in coldfusion.bootstrap.BootstrapFilter.doFilter (BootstrapFilter.java:46) in jrun.servlet.FilterChain.doFilter (FilterChain.java:94) in jrun.servlet.FilterChain.service (FilterChain.java 101) in jrun.servlet.ServletInvoker.invoke (ServletInvoker.java:106) in jrun.servlet.JRunInvokerChain.invokeNext (JRunInvokerChain.java:42) in jrun.servlet.JRunRequestDispatcher.invoke (JRunRava.java28ava servlet.ServletEngineService.dispatch (ServletEngineService.java► 433) in jrun.servlet.jrpp.JRunProxyService.invokeRunnable (JRunProxyService.java:203) in jrunx.scheduler.ThreadPool $ DownstreamMunrjnwr java.jpg .ThreadPool $ ThreadThrottle.invokeRunnable (ThreadPool.java:428) jrunx.scheduler.ThreadPool $ UpstreamMetrics.invokeRunnable (ThreadPool.java:266) in jrunx.scheduler.WorkerThread.run (WorkerThread.java:66)
Is there a better solution to avoid such a cycle or to eliminate this error?
I created the cfm page locally and added some variables to it as follows:
<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">
Every time I refresh this page, the size of free memory was reduced until I started GC. I'm still trying to understand why this is happening. Any suggestions in this regard?
Please, help. Thanks in advance.