2011-08-06 15 views
0

システムメモリを監視して、ビットマップがメモリに収まるかどうかを推測しようとすると、問題が発生します。 はここに私のコードです:私はサムスンギャラクシーS1(アンドロイド2.3.4を実行している)上でそれを実行した場合Androidでの奇妙なメモリの問題

public class MemoryCrashTestActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    String url="http://wallpapers-database.com/images/12_wallpaper_xbiz.jpg"; 

    ArrayList<Bitmap> images= new ArrayList<Bitmap>(); 
    while(true){ 
     checkBitmapFitsInMemory(1600,1200,4); 
     images.add(getImageBitmapFromUrl(url)); 
    } 
} 


public static boolean checkBitmapFitsInMemory(long bmpwidth,long bmpheight, int bmpdensity){ 
    long reqsize=bmpwidth*bmpheight*bmpdensity; 
    long allocNativeHeap = Debug.getNativeHeapAllocatedSize(); 

    Log.w("test","Allocated mem="+allocNativeHeap/1024+" of total="+Runtime.getRuntime().maxMemory()/1024+" required= "+reqsize/1024); 

    if ((reqsize + allocNativeHeap+3*1024*1024) >= Runtime.getRuntime().maxMemory()) 
    { 
     Log.e("test","Next load will crash due to low memory"); 
     return false; 
    } 
    return true; 

} 


public static Bitmap getImageBitmapFromUrl(String url){ 
    URL aURL; 
    Bitmap result = null; 
    try { 

     aURL = new URL(url); 
     URLConnection conn = aURL.openConnection(); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 
     result= BitmapFactory.decodeStream(is); 
     is.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return result; 
} 

}

出力のthats:

Allocated mem=7911 of total=65536 required= 7500 
    Allocated mem=11663 of total=65536 required= 7500 
    Allocated mem=15474 of total=65536 required= 7500 
    Allocated mem=19234 of total=65536 required= 7500 
    Allocated mem=22986 of total=65536 required= 7500 
    Allocated mem=26738 of total=65536 required= 7500 
    Allocated mem=30490 of total=65536 required= 7500 
    Allocated mem=34242 of total=65536 required= 7500 
    Allocated mem=37994 of total=65536 required= 7500 
    Allocated mem=41747 of total=65536 required= 7500 
    Allocated mem=45499 of total=65536 required= 7500 
    Allocated mem=49251 of total=65536 required= 7500 
    Allocated mem=53003 of total=65536 required= 7500 
    Allocated mem=56755 of total=65536 required= 7500 
    Allocated mem=60507 of total=65536 required= 7500 
    Next load probably will crash due to low memory 
     FATAL EXCEPTION: main 
     java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
      at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:628) 
      at com.example.memorycrash.MemoryCrashTestActivity.getImageBitmapFromUrl(MemoryCrashTestActivity.java:56) 
      at com.example.memorycrash.MemoryCrashTestActivity.onCreate(MemoryCrashTestActivity.java:26) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:130) 
      at android.app.ActivityThread.main(ActivityThread.java:3687) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:507) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
      at dalvik.system.NativeStart.main(Native Method) 

動作するようです。 HTCの山火事を使用する場合も同様の出力。しかし、Asus eee padトランス(Android 3.1)で試してみると、出力:

 Allocated mem=2585 of total=49152 required= 7500 
     Allocated mem=2588 of total=49152 required= 7500 
     Allocated mem=2647 of total=49152 required= 7500 
     Allocated mem=2655 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2656 of total=49152 required= 7500 
     Allocated mem=2657 of total=49152 required= 7500 
     Allocated mem=2657 of total=49152 required= 7500 
     ERROR/dalvikvm-heap(1398): Out of memory on a 3840016-byte allocation. 
     08-06 05:05:19.490: WARN/dalvikvm(1398): threadid=1: thread exiting with uncaught exception (group=0x40168760) 
      FATAL EXCEPTION: main 
      java.lang.OutOfMemoryError 
       at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
       at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493) 
       at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549) 
       at com.example.memorycrash.MemoryCrashTestActivity.getImageBitmapFromUrl(MemoryCrashTestActivity.java:56) 
       at com.example.memorycrash.MemoryCrashTestActivity.onCreate(MemoryCrashTestActivity.java:26) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
       at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
       at android.os.Handler.dispatchMessage(Handler.java:99) 
       at android.os.Looper.loop(Looper.java:132) 
       at android.app.ActivityThread.main(ActivityThread.java:4025) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:491) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
       at dalvik.system.NativeStart.main(Native Method) 

どうしてですか?

おかげ

答えて

1

は、Android 3.0の前に、ビットマップは、あなたはDebug.getNativeHeapAllocatedSize();を上げて見る理由です、ネイティブヒープに格納されていました。

3以降、これらはJavaヒープに格納されます。 3.0エミュレータがあまりにも遅いよう

Watch this from the 10 minute mark.

おそらくあなたは、メモリ使用量を取得するためにsomething like thisを使用する必要があります、私がテストすることはできません。