6

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 at java.io.WinNTFileSystem.getBooleanAttributes(Native Method) at java.io.File.exists(File.java:733) at coldfusion.xml.XmlProcessor.getSourceURL(XmlProcessor.java:246) Coldfusion で。 xml.XmlProcessor.parse(XmlProcessor.java:155)、coldfusion.tagext.lang.XmlTag.doEndTag(XmlTag.java:85)、cffeeds2ecfc1003675922$funcDEMO1._factor8(C:\component\abc.cfc:1235)、cffeeds2ecfc1003675922$ funcDEMO1.runFunction(C:\component\abc.cfc:1192) で coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) で coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) で coldfusion. runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) で coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) で coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) coldfusion.runtime.UDFMethod.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.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368)。 filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) で coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) で coldfusion.runtime.UDFMethod.invoke(UDFMethod.java: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.invoke(PathFilter.java:94) で coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) で coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) で coldfusion.filter.BrowserFilter.invoke (BrowserFilter.java:38) で coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) で coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) で coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java: 22) coldfusion.xml.rpc.CFCServlet.invoke(CFCServlet.java:139) で、coldfusion.xml.rpc.CFCServlet.doPost(CFCServlet.java:290) で javax.servlet.http.HttpServlet.service(HttpServlet.java:760) で org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327) で javax.servlet.http.HttpServlet .service(HttpServlet.java:853) で coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) で jrun.servlet.FilterChain.doFilter(FilterChain.java:86) で com.intergral.fusionreactor.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.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)、coldfusion.bootstrap.BootstrapFilter で。jrun.servlet.FilterChain.doFilter(FilterChain.java:94) での doFilter(BootstrapFilter.java:46) jrun.servlet.FilterChain.service(FilterChain.java:101) での jrun.servlet.ServletInvoker.invoke(ServletInvoker.java) :106) jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun .servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) でjrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) で jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)66)66)java:46) jrun.servlet.FilterChain.doFilter(FilterChain.java:94) で jrun.servlet.FilterChain.service(FilterChain.java:101) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) でjrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp .JRunProxyService.invokeRunnable(JRunProxyService.java:203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) jrunx.scheduler で。 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) での ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)java:46) jrun.servlet.FilterChain.doFilter(FilterChain.java:94) で jrun.servlet.FilterChain.service(FilterChain.java:101) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) でjrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp .JRunProxyService.invokeRunnable(JRunProxyService.java:203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) jrunx.scheduler で。 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) での ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) で jrun.servlet.FilterChain.service(FilterChain.java:101) で FilterChain.doFilter(FilterChain.java:94) .java:42) jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java: 203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java) :266) jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) でjrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) で jrun.servlet.FilterChain.service(FilterChain.java:101) で FilterChain.doFilter(FilterChain.java:94) .java:42) jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java: 203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java) :266) jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) でjrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) で FilterChain.service(FilterChain.java:101) .java:286) jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) で jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool. java:320) jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) で jrunx.scheduler.WorkerThread.run(WorkerThread.java) :66)jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher) で jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) で FilterChain.service(FilterChain.java:101) .java:286) jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) で jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool. java:320) jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) で jrunx.scheduler.WorkerThread.run(WorkerThread.java) :66)JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable (JRunProxyService.java:203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics で。 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)でinvokeRunnable(ThreadPool.java:266)JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) で jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) で jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) で jrun.servlet.jrpp.JRunProxyService.invokeRunnable (JRunProxyService.java:203) jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool$UpstreamMetrics で。 jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)でinvokeRunnable(ThreadPool.java:266)jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で JRunProxyService.invokeRunnable(JRunProxyService.java:203) jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) で jrunx.scheduler.ThreadPool $UpstreamMetrics.invokeRunnable(ThreadPool.java:266) で jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) で JRunProxyService.invokeRunnable(JRunProxyService.java:203) jrunx.scheduler.ThreadPool$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 を実行するまで空きメモリ サイズが減少していました。なぜこれが起こっているのか、私はまだ理解しようとしています。この点で何か提案はありますか?

助けてください。前もって感謝します。

4

1 に答える 1