[akabana-user:203] Re: S2Flexのメモリリークについて

有井 貴志 [E-MAIL ADDRESS DELETED]
2008年 10月 28日 (火) 20:02:23 JST


ふなくら(nod)さん。

お世話になっております。有井です。

メールが遅れて申し訳ありません。

やはりメモリに残りますよね。
自分だけかと思っていましたが確認されて良かったです。

remoteCallのAsyncTokenに渡しているオブジェクトが問題かと思ってましたが
serviceを使うか使わないかで変わるとは・・・何故か気がつきませんでした。

> 現状では、module化する部分を再度検討するとか
> module化しても、LoadはしてもUnloadしないとか
> 各パーツはコンポーネント化までにしておくなど
> やや後ろ向きな対応ということになってしまうかもしれません。

unloadしないとなるとメモリリークの箇所は再利用されないみたいなので
地味に使用メモリが増えてしまって;

最悪の場合は後ろ向きな対応を行おうと考えていますが
もう少し粘ろうと思います。

お時間取らせてしまい申し訳ありません。

jun funakura さんは書きました:
> 有井さん
> 
> ふなくら(nod)です。
> 
> 貼付けていただいたコードをベースに新規にいろいろ作成して
> 先週検証をしました。
> 
> Profilerで確認すると、ご指摘の通り、Unloadしてもライブオブジェクトで
> インスタンスが残ってしまいますね。
> 
> 確認したところ、
> S2Flex2Service
> NetConneciton
> RelayResponder
> RemoteMessage
> RpcOperation
> などが残っているようです。S2Flex2-Componentsのクラス群が
> いっぱいありました。orz...
> 
> Serviceを呼び出した後に、EventListenerをremoveしたり
> 参照がなくなるように変数の参照をなくしたり
> いろいろやって見ているのですが、解消できていません。
> 
> サービスを呼び出さなければUnloadしたときに消えるようですので
> moduleのUnloadに対応するにはコンポーネントを作り替えないと
> いけないかもしれません。時間がかかってしまいそうです。
> 
> インスタンスの参照が残っているとUnloadしてもメモリ上に
> 残ってしまうのでむずかしいところです。
> 
> 現状では、module化する部分を再度検討するとか
> module化しても、LoadはしてもUnloadしないとか
> 各パーツはコンポーネント化までにしておくなど
> やや後ろ向きな対応ということになってしまうかもしれません。
> 
> 中垣さんのblogエントリーなどをみても
> Flex3になったときに内部構造を変更しているようですので
> module対応する際には結構考慮する必要はあるようです。
> http://shigeru-nakagaki.com/index.cfm?mode=entry&entry=5C3CB39F-3048-785E-311079E8AD1FC9FF&lang=ja_JP
> 
> 以上、あまりどうすればいいか?の回答にはなってませんが
> 現状の報告まで。
> 
> --
> ふなくら(nod)
> 
> 
> 
> 2008/10/16 19:32 有井 貴志 <[E-MAIL ADDRESS DELETED]>:
>> 有井です。
>>
>> ふなくらさん、ご回答有難うございます。
>>
>> メモリはお察しの通り、FlexBuilderのProfilerで確認しました。
>> loadしてunloadした後にメモリのスナップショットを見て確認しています。
>>
>> 正しくUnloadされたものは
>> ModuleにPanelを貼り付けて終わりという程度のもので、
>> 特にEventListenerで処理しているものはありません。
>>
>> よろしくお願い致します。
>>
>> jun funakura さんは書きました:
>>> ふなくら(nod)です。
>>>
>>> メールチェックを怠っていましたm(__)m
>>> 下記現象確認いたしますので
>>> 少しお待ちください。
>>>
>>> componentsを作成したのは、moduleが出てくる以前だったので
>>> 確認していませんでした。
>>>
>>> モジュールについては、過去にLoad/Unloadで問題がでていたり
>>> 過去のバージョンではメモリーリークが発生していたようです。
>>>
>>> たとえば以下のフォーラムなど。
>>> http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=807&forum=2&post_id=3185
>>>
>>> またAddEventListenerをしているなどでオブジェクトの参照が残って
>>> Unloadされない現象といったこともあるようです。
>>>
>>> メモリに残っているというのを確認したのは、
>>> Profilerで確認したということでよろしいでしょうか。
>>> 正しくUnloadされたものは、どんな形で試されたか、
>>> EventListenerの処理をしているなど教えていただけますと
>>> 助かります。
>>>
>>> 以上よろしくお願いいたします。
>>>
>>> --
>>>
>>>
>>> 2008/10/14 20:34 有井 貴志 <[E-MAIL ADDRESS DELETED]>:
>>>> お世話になります。有井と申します。
>>>>
>>>> S2Flexを用いたModuleをModuleLoaderでロード・アンロードすると
>>>> 何故かメモリが残ったままになってしまいます。
>>>> S2Flexを使用していないModuleではメモリ解放が確認できました。
>>>>
>>>> 自分のソースが悪いのかどうなのかも分からず困っております。
>>>>
>>>> お忙しい所、お手数お掛けしてしまい本当に申し訳ございませんが
>>>> 何が問題なのかご教示頂けませんでしょうか?
>>>>
>>>> 環境
>>>> ・flexSDK Flex 3.1
>>>> ・s2flex2-components.swc
>>>> ・s2-flex2-1.1.1-rc1
>>>> ・s2-framework-2.4.29
>>>> ・JDK6
>>>> ・Tomcat5.0.28
>>>>
>>>> 以下ソースです
>>>> -Main.mxml-----------------------------------------
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
>>>>    layout="vertical">
>>>>
>>>>    <mx:ApplicationControlBar width="100%">
>>>>        <mx:Button label="load" click="load()"/>
>>>>        <mx:Button label="unload" click="unload()"/>
>>>>    </mx:ApplicationControlBar>
>>>>
>>>>    <mx:ModuleLoader id="mloader"
>>>>        width="100%" height="100%"/>
>>>>
>>>>    <mx:Script>
>>>>        <![CDATA[
>>>>            private function load(): void
>>>>            {
>>>>                mloader.url = "S2FlexSample1.swf";
>>>>                mloader.loadModule();
>>>>            }
>>>>            private function unload(): void
>>>>            {
>>>>                mloader.unloadModule();
>>>>            }
>>>>        ]]>
>>>>    </mx:Script>
>>>> </mx:Application>
>>>> --------------------------------------------------
>>>>
>>>> -S2FlexSample.mxml--------------------------------
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <mx:Module
>>>>    xmlns:mx="http://www.adobe.com/2006/mxml"
>>>>    xmlns:s2flex="memory.web.s2flex.*"
>>>>    width="100%" height="100%">
>>>>    <s2flex:Sample1/>
>>>> </mx:Module>
>>>> --------------------------------------------------
>>>>
>>>> memory.web.s2flexパッケージ
>>>> -Sample1.mxml-------------------------------------
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <mx:Panel
>>>>    xmlns:mx="http://www.adobe.com/2006/mxml"
>>>>    xmlns:seasar="http://www.seasar.org/s2flex2/mxml"
>>>>    xmlns:s2flex="memory.web.s2flex.*"
>>>>    width="100%" height="100%">
>>>>    <seasar:S2Flex2Service id="service"
>>>>        destination="sampleService" showBusyCursor="true"/>
>>>>        <s2flex:Sample1Page id="page"/>
>>>>        <mx:Image source="image/dummy.jpg"/>
>>>> </mx:Panel>
>>>> --------------------------------------------------
>>>>
>>>> -Sample1Page.as-----------------------------------
>>>> package memory.web.s2flex {
>>>>  import flash.events.Event;
>>>>  import mx.controls.Alert;
>>>>  import mx.rpc.events.FaultEvent;
>>>>  import mx.rpc.events.ResultEvent;
>>>>  import memory.web.AbstractPage;
>>>>
>>>>  [Bindable]
>>>>  public class Sample1Page extends AbstractPage {
>>>>
>>>>    override public function onCreationComplete(event: Event): void {
>>>>      super.onCreationComplete(event);
>>>>      getMessage();
>>>>    }
>>>>
>>>>    public function getMessage():void {
>>>>      remoteCall(service.getMessage(),
>>>>                  getMessageOnSuccess,
>>>>                  getMessageOnFault);
>>>>    }
>>>>
>>>>    public function getMessageOnSuccess(e:ResultEvent
>>>>                                        ,token:Object=null):void {
>>>>      Alert.show(e.result as String);
>>>>    }
>>>>
>>>>    public function getMessageOnFault(e:FaultEvent
>>>>                                        ,token:Object=null):void {
>>>>      Alert.show(e.message as String);
>>>>    }
>>>>  }
>>>> }
>>>> --------------------------------------------------
>>>>
>>>> Java
>>>> -SampleService.java-------------------------------
>>>> package memory.web;
>>>>
>>>> public interface SampleService {
>>>>  public String getMessage();
>>>> }
>>>> --------------------------------------------------
>>>>
>>>> -SampleServiceImpl.java---------------------------
>>>> package memory.web.impl;
>>>>
>>>> import org.seasar.flex2.rpc.remoting.service.annotation.RemotingService;
>>>> import memory.web.SampleService;
>>>>
>>>> @RemotingService
>>>> public class SampleServiceImpl implements SampleService {
>>>>  public SampleServiceImpl() {
>>>>  }
>>>>
>>>>  public String getMessage(){
>>>>    return "Server Message";
>>>>  }
>>>> }
>>>> --------------------------------------------------
>>>>
>>>> 長々とソースを貼ってしまい申し訳ありません。
>>>> 何卒、よろしくお願い致します。
>>>>
>>>> _______________________________________________
>>>> akabana-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/akabana-user
>>>>
>>> _______________________________________________
>>> akabana-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/akabana-user
>> _______________________________________________
>> akabana-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/akabana-user
>>
> _______________________________________________
> akabana-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/akabana-user



akabana-user メーリングリストの案内