Действительно ли область действия VAR действительно быстро собирает мусор, если ссылка является общей? - PullRequest
0 голосов
/ 23 февраля 2011

если у меня есть функция, скажем

<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 !!!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Когда вы возвращаете значение из объекта, оно не возвращается как ссылка.Попробуйте это:

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.

С учетом сказанного исходная локальная переменная в компоненте должна собирать мусор одновременно с самим экземпляром компонента.в то время как структура, сидящая в сеансе, не будет собирать мусор, пока сеанс не сделает это.

0 голосов
/ 28 февраля 2011

делает переменную области видимости var (myDetails) мусором сразу после завершения вызова функции!или он будет ждать, пока последняя дочерняя переменная, которая все еще ссылается на нее, не будет удалена

Если вы имеете в виду базовую структуру, то это последняя.Первая часть кода создает единую структуру в памяти, но несколько ссылок на эту структуру.Ничего не копируется.Таким образом, базовая структура не будет приемлемой для сборки мусора до тех пор, пока последняя ссылка не выйдет из области видимости / недоступна.

 // First Reference 
 var mydetails = {};

Первая ссылка выходит из области видимости, когда cffunction заканчивается

 <cfset variables.myDetails = myObject.getDetails() />

Другая ссылка выходит из области видимости, когда сценарий .cfm заканчивается

 // Last Reference
 session.amKeepingHer = mydetails;

Последняя ссылка имеет самый длинный срок службы.Это выходит за рамки только когда session заканчивается.Итак, вернемся к первоначальному вопросу: исходная структура не будет иметь права на сборку мусора до завершения сеанса.JVM решает, когда на самом деле происходит сборка мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...