非常に長い文字列を作成してアプリケーションをスローさせようとしていますが、スロー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 の同様のバグは見つかりません。
誰でも再現できますか?
<?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>