2009-04-27 33 views
2

我遇到了ColdFusion堆的問題。這是我正在試驗的一個小示例應用程序。我想cfinvoke調用init方法後,它銷燬組件本地的所有變量。但顯然情況並非如此。該應用程序的工作原理如下,但如果我在index.cfm的循環中添加一個零就會中斷。什麼是存儲在堆中的原因?有沒有解決的辦法?ColdFusion中的CFINVOKE與java.lang.OutOfMemoryError

index.cfm:

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

test.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` 

任何幫助不勝感激。

+0

您應該添加什麼版本你正在運行ColdFusion,這是未來的相關信息。 – 2009-04-27 20:10:27

回答

3

這是一個已知的問題,目前沒有辦法繞過它。看來CF不會正確處理垃圾收集。據我所知,在請求完成之前,它不會銷燬和釋放組件使用的內存。

因此,取決於組件具有多少屬性將決定您可以創建多少個屬性,直至出現堆錯誤。

我知道這並不能幫助你的問題,但至少現在你可以採取措施來防止它。

+0

我意識到這是一個相當古老的問題,但是你能夠在09年引用你的來源來解決這個所謂的已知問題嗎? – 2012-01-14 16:45:35

+0

http://rip747.wordpress.com/2008/09/29/help-force-coldfusion-to-release-memory/ – rip747 2012-02-02 14:59:36

2

rio747是正確的,內存不會釋放,直到請求結束,所以你只是內存不足。我冒昧地說,你可以運行它,並得到錯誤,刪除0,它會運行; Java垃圾收集正在運行,但是直到請求結束。

解決方案的唯一選擇是不要在單個請求中創建多個對象(可能需要更多關於這是必要的更多信息?)或增加可用於coldfusion的內存量。

我不認爲這真的是一個問題或CF沒有正確處理垃圾收集;從java的角度來看,只要該請求處於活動狀態,對象仍然可以被使用和引用。我的意思是,你對cfinvoke及其工作原理是正確的,但這並不意味着jvm實際上可以在這些內存位置上運行垃圾收集,直到請求結束。

相關問題