2

我遇到了 ColdFusion 堆的问题。这是我正在试验的一个小示例应用程序。我认为在cfinvoke调用该init方法后它会破坏组件本地的所有变量。但显然情况并非如此。该应用程序如下所示工作,但如果我在其中的循环中添加一个零,index.cfm它就会中断。什么存储在堆中导致这种情况?有没有解决的办法?

索引.cfm:

<cfloop from="1" to="1000" index="i">  
    <cfinvoke component="test" method="init" returnvariable="x">  
</cfloop>  
<cfoutput><p>#x#</p></cfoutput>

测试.cfc:

<cfcomponent output="false">  
    <cffunction name="init" returntype="string">  
        <cfset var test = structNew()>  
        <cfloop from="1" to="1000" index="i">  
            <cfset test[i] = i>  
        </cfloop>  
        <cfreturn Now()>  
    </cffunction>  
</cfcomponent>

这是错误消息:

 SEVERE: Servlet.service() for servlet CfmServlet threw exception  
 javax.servlet.ServletException: ROOT CAUSE:  
 java.lang.OutOfMemoryError: Java heap space`

任何帮助,将不胜感激。

4

3 回答 3

3

这是一个已知问题,目前无法解决。似乎 CF 不能正确处理垃圾收集。据我所知,在请求完成之前,它不会破坏和释放组件使用的内存。

正因为如此,取决于你的组件有多少属性将决定你可以创建多少个属性,直到你得到堆错误。

我知道这对你的问题没有帮助,但至少现在你可以采取措施来防止它。

于 2009-04-27T12:48:37.817 回答
2

rio747 是正确的,在请求结束之前内存不会释放,所以你只是内存不足。我敢说您可能可以运行它并得到错误,删除 0 它将运行;java垃圾收集正在运行,但直到请求结束。

您解决问题的唯一选择是不在单个请求中创建尽可能多的对象(也许更多关于为什么这是必要的信息?)或增加可用于冷融合的内存量。

我不认为这真的是一个问题,或者 CF 没有正确处理垃圾收集;从 java 的角度来看,只要该请求处于活动状态,该对象仍然可以被使用和引用。我的意思是,您对 cfinvoke 及其工作原理是正确的,但这并不意味着 jvm 可以在这些内存位置上实际运行垃圾收集,直到请求结束。

于 2009-04-27T15:31:34.900 回答
0

我刚刚发布了一个新的博客文章,它展示了如果你的内存低于某个阈值,你可以如何进行程序化垃圾收集。希望它有所帮助:-

[ http://www.beetrootstreet.com/blog/index.cfm/2009/6/25/Clearing-ColdFusion-memory-using-garbage-collection-when-memory-gets-low][1]

于 2009-06-25T14:05:18.873 回答