[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 メーリングリストの案内