0

非常に長い文字列を作成してアプリケーションをスローさせようとしていますが、スローMemoryErrorする代わりにハングします。

リリースビルドとデバッグビルドの両方で、air sdk 3.4および3.8でこれを試しました。強制的にアプリを閉じると、Eclipseに次のようなものが表示されることがありapp exited with error code:out of memoryます。

[Unload SWF] myapp.swfコードの実行後にコンソールに行が含まれていることにも気付きました(trace(str.length)文字列を2倍にした後に追加すると、 length の後に発生することがわかります369098752)。

AS3 Reference for MemoryErrorで、これが正当な原因であることを確認できますMemoryError

では、アプリのクラッシュを許可する代わりに、これらの MemoryErrors を実際にキャッチするにはどうすればよいでしょうか?

これが私のコードです:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                        creationComplete="onCreation(event)"                        
                       >
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.FlexEvent;         
            import avmplus.getQualifiedClassName;

            protected var str:String = 'ssssssssssssssssssssss';
            protected function onCreation(event:FlexEvent):void{
                var serverString:String = unescape(Capabilities.serverString);
                try{
                    while(true){
                        str+=str;
                    }
                }catch(e:MemoryError){
                    Alert.show('memoryError');
                }
            }           
        ]]>
    </fx:Script>   
</s:WindowedApplication>

更新: テスト アプリを改善しました。エラーやキャッチされていないエラーがスローされていないことが明確にわかります。メモリ使用量が 1700 ~ 1750MB に達するとクラッシュします。バグベースで私のケースに似たバグをいくつか見つけましたが、それらは air 2.x に関連しており、修正済み/バグではないとマークされています。Air 3.x の同様のバグは見つかりません。

バグ: >1.7GB を割り当てるとアプリがクラッシュする

バグ: 2GB に近づくとアプリがクラッシュする

誰でも再現できますか?

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                        applicationComplete="onCreation(event)"                     
                       >
    <fx:Script>
        <![CDATA[
            import flash.utils.setInterval;

            import mx.controls.Alert;
            import mx.events.FlexEvent;

            import avmplus.getQualifiedClassName;

            protected var vectors:Vector.<Vector.<uint>>= new Vector.<Vector.<uint>>();
            protected function onCreation(event:FlexEvent):void{
                loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,onUncaughtError);
                var serverString:String = unescape(Capabilities.serverString);
                trace('vm version: '+System.vmVersion);
                setInterval(increaseMemoryUsage,100);
            }

            protected function increaseMemoryUsage():void{
                try{
                    var vector:Vector.<uint> = new Vector.<uint>();
                    vector.length = 1024*1024/4;//1MB
                    vectors.push(vector);
                    System.gc();
                    trace(vectors.length*1+'MB');
                    trace('total: '+System.totalMemoryNumber+', private: '+System.privateMemory+', free: '+System.freeMemory);
                    totalMemoryDisplay.text=''+int(System.totalMemoryNumber/(1024*1024))+'MB';
                }catch(e:MemoryError){
                    trace('it catches!');
                    Alert.show('memoryError');
                }catch(e:Error){
                    trace('error'+e.errorID);
                }
            }


            protected function onUncaughtError(e:UncaughtErrorEvent):void{
                trace('it is uncaught!');
            }
        ]]>
    </fx:Script> 
    <s:Label id="totalMemoryDisplay" />
</s:WindowedApplication>
4

0 に答える 0