如果共享引用,VAR函数中的范围是否真的可以快速收集垃圾?

时间:2011-02-23 20:27:04

标签: coldfusion garbage-collection

如果我有一个功能说

<cfcomponent name="details">
<cffunctiion  name="getDetails" access="public" returntype="struct">
<cfscript>
var mydetails = {};
mydetails.fName='lilly';
mydetails.lName ='flower';
</cfscript>
<cfreturn mydetails >
</cffunction>
</cfcomponent>

现在我将调用此函数并返回会话变量

<cfset session.mydetails = details.getDetails()>

我在这里得到的是该函数的结构mydetails(因为它是一个复杂的对象)的参考。我相信引用将指向我调用函数时创建的内存位置,并在其中创建变量。

因为我的引用仍然通过我的新session.myDetails变量指向内存位置,所以var范围真的会被垃圾收集!

2 个答案:

答案 0 :(得分:2)

从对象返回值时,它不会作为引用返回。试试这个:

TestComponent.cfc

<cfcomponent name="details">

    <cffunction  name="getDetails" access="public" returntype="struct">
        <cfscript>
            var mydetails = {};
            mydetails.fName='lilly';
            mydetails.lName ='flower';
            mydetails.timestamp = GetTickCount();
        </cfscript>

        <cfreturn mydetails />

    </cffunction>

</cfcomponent>

Test.cfm

<cfset myObject = CreateObject("component", "TestComponent") />
<cfset myDetails = myObject.getDetails() />
<cfdump var="#myDetails#" label="First Request" />
<cfset otherDetails = myObject.getDetails() />
<cfdump var="#myDetails#" label="After second request" />
<cfdump var="#otherDetails#" label="otherDetails from second request" />

您会注意到myDetails的第一个和第二个转储是相同的,这意味着第二个请求(其中变量设置为“otherDetails”)不会更改“myDetails”中的原始值。这意味着返回了结构,并将其分配给变量byValue而不是byReference。

说到这一点,组件中的原始局部变量应该与组件实例本身同时进行垃圾收集,而会话中的struct在会话之前不会被垃圾收集。

答案 1 :(得分:0)

  

是var范围变量   (myDetails)是垃圾收集   函数调用时立即执行   完成了!或者它会等到最后   儿童变量仍然存在   提到它被删除

如果你的意思是底层结构,那就是后者。代码的第一部分在内存中创建了一个结构,但是对该结构进行了多次引用。没有任何东西被复制。因此,在最后一个引用超出范围/不可达之前,底层结构将不会符合进行垃圾收集。

 // First Reference 
 var mydetails = {};

cffunction结束

时,第一个引用超出范围
 <cfset variables.myDetails = myObject.getDetails() />

.cfm脚本结束时,另一个引用超出范围

 // Last Reference
 session.amKeepingHer = mydetails;

最后一次参考的寿命最长。 session结束时,它只会超出范围。所以回到最初的问题:在会话结束之前,原始结构不符合垃圾收集的条件。 jvm决定实际发生垃圾收集的时间。