Expand my Community achievements bar.

SOLVED

Session Garbage Collection

Avatar

Level 3

I'm unable to garbage collect a ConnectSessionContainer. I've run close on it and individulally on each of it's managers, removed all listeners removed it from the displayList and set it = to null. Still the session persists.

I haven't been able to find much info on it in the docs. Any direction / suggestions would really help.

John

1 Accepted Solution

Avatar

Correct answer by
Former Community Member

Johny,

I am not going to fix it for you. If you want to change anything, go ahead but I won't help you for sure.

I don’t have a magic wand and I did made a few changes and couldn’t notice thing you mentioned and so I didn’t reply and I am well within my right to not reply.

Thanks

Hironmay Basu

View solution in original post

26 Replies

Avatar

Former Community Member

You can directly mail me and I will take it offline on a daily basis.

Thanks

Hironmay Basu

Avatar

Level 3

Hironmay,

I mailed you several times. I haven't heard a response. This issue has been open for along time. Have you had time to look into the memory leak for the AudioPublisher component? Is there a way to escalate this issue? At this point it stands to cost my company hundreds of thousands of dollars. I need to resolve this ASAP.

I've gone though your component and found a few straggling event listeners. I've explicitly removed, closed and nulled the _stream. Not sure what else might be holding it.

Help,

John

Avatar

Correct answer by
Former Community Member

Johny,

I am not going to fix it for you. If you want to change anything, go ahead but I won't help you for sure.

I don’t have a magic wand and I did made a few changes and couldn’t notice thing you mentioned and so I didn’t reply and I am well within my right to not reply.

Thanks

Hironmay Basu

Avatar

Employee

Jonny, let me try to clarify Hironmay's point.

This forum is monitored AS A VOLUNTARY EFFORT by the LCCS engineering team. We don't have a resource dedicated to this and we use our spare time trying to help you guys out. If you notice we still manage to reply to requests "almost" 24/7 but you may also have noticed that while we are very responsive to customers that clearly explain their problems and help us reproduce them we sometime get "silent" with customers that pretend to get the problem resolved but don't offer too much help.

I know you tryied to explain your problem but we don't seem to be able to reproduce it so you either get us an example that we can work with or try to better explain your exact use case (I have asked many time to better describe your application but didn't get any answer). If you don't want to divulge information about your application on the forum you can send us a private message, but unless you are willing to help us out there isn't much we can do.

I am sorry to hear that your company may lose money on this, and if you have a support contract with Adobe (or any kind of paid contract) please feel free to escalate your problem using the standard channels and somebody will be assigned to your case.

Otherwise, as I said, we are also busy with working on new features and fixing problems that we have been able to reproduce, but please feel free to send us a bug report and we will work on getting it fixed for the next scheduled release.

Avatar

Level 3

Raff,

Thanks for your response. I was unaware that there was another channel to get support for this service, paid or otherwise. That is what I was asking above. I was also unaware that your efforts were voluntary. Your response times have been very quick. As I understood it this was Adobe's support method for the service so I naturally assumed there were resources dedicated to support it. My expectations are obviously wrong. Sorry if my posted sounded abrupt.

Can you be more clear on what steps I would need to take to get dedicated support?

I'm sorry if I wasn't more clear, it might have been in an email. I don't see the explanation I thought I sent. so let me try to clarify.

here's my view

<?xml version="1.0" encoding="utf-8"?>

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"

xmlns:rtc="http://ns.adobe.com/rtc"

xmlns:controls="controls.*"

xmlns:custom="LCCSCustomizedClasses.*"

xmlns:business="business.*"

xmlns:maps="com.rhythmLive.maps.*"

xmlns:mate="http://mate.asfusion.com/" xmlns:maps1="com.rhythmCore.maps.*

xmlns:CustomRoster="controls.CustomRoster.*"

xmlns:LiveRoster="com.rhythmLive.controls.LiveRoster.*"

xmlns:rhythmCore="com.rhythmCore.*"

xmlns:LiveCursorPane="com.rhythmLive.controls.LiveCursorPane.*"

xmlns:LiveVideo="com.rhythmLive.controls.LiveVideo.*"

xmlns:LiveChat="com.rhythmLive.controls.LiveChat.*"

xmlns:views="com.rhythmLive.views.*"

xmlns:events="com.adobe.rtc.events.*"

xmlns:liveControls="com.rhythmLive.controls.*"

backgroundAlpha="0"

width="400" xmlns:lccsExtensions="com.rhythmLive.controls.lccsExtensions.*">

<maps:LCCSMap id="live"/>

<mx:Script>

<![CDATA[

import com.rhythmLive.model.CursorTarget;

import com.adobe.rtc.session.ConnectSession;

import com.adobe.rtc.session.sessionClasses.PrimarySession;

import com.rhythmLive.controls.lccsExtensions.LiveConnectSession;

import com.rhythmLive.business.LiveConnectionManager;

import com.adobe.rtc.sharedManagers.descriptors.UserDescriptor;

import mx.containers.TabNavigator;

import com.adobe.rtc.messaging.UserRoles;

import com.adobe.rtc.sharedManagers.descriptors.StreamDescriptor;

import com.rhythmCore.model.Settings;

import com.rhythmLive.controls.LiveRoster.renderers.FullControlUserItemRenderer

]]>

</mx:Script>

<!--

<mate:Debugger level="{Debugger.ALL}" />-->

<!--**

*

* ConnectSession authenticator

*

**-->

<rtc:AdobeHSAuthenticator id="auth" />  

<rtc:ConnectSessionContainer id="connectSession"

          authenticator="{auth}"

          autoLogin="false"

          backgroundAlpha="0"

          width="100%" height="100%">

     <mx:VBox width="100%" height="100%">

          <rtc:WebcamSubscriber id="videoPlayback" webcamPublisher="{video.webCamPublisher}" width="100%" left="10" right="10" />

          <mx:Panel width="100%" layout="absolute" left="0" right="0" bottom="0" paddingLeft="10" paddingTop="10" title="Attendees" id="attendeePanel"                     styleName="notesPanelStyle" >

               <LiveRoster:LiveRoster id="rosterList" left="0" top="0"

                                        iconSize="18" rowHeight="30"

                                        itemRenderer="com.rhythmLive.controls.LiveRoster.renderers.FullControlUserItemRenderer"

                                        width="100%" borderStyle="none"  backgroundAlpha="0"/>

          </mx:Panel>

          <mx:Panel height="75%" width="100%" layout="absolute" left="0" right="0" bottom="0" title="Ask a Question" id="questionPanel"                     styleName="notesPanelStyle" >

               <LiveChat:LiveChat id="chat" width="100%" height="100%" />

          </mx:Panel>

     </mx:VBox>

     <lccsExtensions:LiveAudioPublisher id="VoiPPub"/>

     <rtc:AudioSubscriber id="VoiPSub"/>

     <LiveVideo:LiveWebCamera id="video"   />

</rtc:ConnectSessionContainer>

</mx:Canvas>

LiveAudioPublisher extends AudioPublisher with the addition of some cleanup code that I tried. It's listed here.

package com.rhythmLive.controls.lccsExtensions

{

import com.adobe.rtc.collaboration.AudioPublisher;

import com.adobe.rtc.events.ArchiveEvent;

import com.adobe.rtc.events.CollectionNodeEvent;

import com.adobe.rtc.events.StreamEvent;

import com.adobe.rtc.events.UserEvent;

import com.adobe.rtc.util.Invalidator;

import flash.events.ActivityEvent;

public class LiveAudioPublisher extends AudioPublisher

{

public function LiveAudioPublisher()

{

super();

}

override public function close():void

{

     super.close();

     // additional cleanup to allow for garbage collection

    if ( _stream) {

         _stream.attachAudio(null);

         _stream.close();

        _stream = null;

     }

}

Here's the cleanup code that's run on the view before it's removed.

// destroy VOIP

   if ( _view.VoiPPub )

    {

       _view.VoiPPub.close();

       _view.VoiPPub.connectSession = null;

        _view.VoiPPub.deleteReferenceOnParentDocument( _view );

    

If I remove the  <lccsExtensions:LiveAudioPublisher id="VoiPPub"/> component from the view it gc's correctly in the Flex 3 profiler if this component exists then it doesn't allow the view to gc.

I hope this clarifies and I really appreciate your help,

John

Avatar

Employee

So, I tried to reproduce the problem using your code. Of course it doesn't compile as is and I had to make some changes.

Also, I am not sure of how / when you call the login / logout to connect to the room and how you create / destroy the view.

I have tried with a simple button that creates the view, adds it to the display list and start the room and when clicked again removes it from the display list and tries to dispose of it (not sure of how you dispose of the view since by default it stays loaded, just invisible).

Anyway, I don't seem to be able to reproduce the problem (and without the view properly being unloaded everything pretty much stays in memory). We need some more details from you. The best thing would be a "working" example that reproduces the problem, otherwise more information and/or code from your application would help (if you want you can send it to me via private message).

The following has evaluated to null or missing: ==> liqladmin("SELECT id, value FROM metrics WHERE id = 'net_accepted_solutions' and user.id = '${acceptedAnswer.author.id}'").data.items [in template "analytics-container" at line 83, column 41] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign answerAuthorNetSolutions = li... [in template "analytics-container" at line 83, column 5] ----