2012-02-06 108 views
0

我需要的內存大的量,我嘗試測試:Android的虛擬機總內存的最大內存

long max = Runtime.getRuntime().maxMemory(); 
    long available = Runtime.getRuntime().totalMemory(); 
    long free = Runtime.getRuntime().freeMemory(); 

    AssetManager manager = getApplicationContext().getAssets(); 
    ArrayList<Bitmap> list = new ArrayList<Bitmap>(); 
    for (int i = 0; i < 34; i++) { 
     try { 
      Bitmap btm = BitmapFactory.decodeStream(manager.open("image.png")); 
      list.add(btm); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.d("Total ", Runtime.getRuntime().totalMemory()/1024f/1024f + ""); 
     Log.d("Free ", Runtime.getRuntime().freeMemory()/1024f/1024f + ""); 
    } 

      //dont let vm to clear bitmaps 
    for (Bitmap object : list) { 
     object.setDensity(Bitmap.DENSITY_NONE); 
    } 

    Log.d("Total ", Runtime.getRuntime().totalMemory()/1024f/1024f + ""); 
    Log.d("Free ", Runtime.getRuntime().freeMemory()/1024f/1024f + ""); 

我測試了這一點,它拋出內存溢出(VM不能讓爲這個應用程序分配超過5 MB)

設備(例如燒火)最大= 64 MB,總= 5MB免費2.3 MB和,如果我使用更多然後5 MB(總存儲器)VM力接近上

。 是否有可能增加VM堆大小MaxMemory(64)?

回答

0

你好,你需要去Android虛擬設備管理器(AVD管理器),然後單擊編輯那裏你可以更改內存大小,從而可以使運行您的應用空間。

+0

我正在編寫的應用程序將工作在我需要模擬器的所有設備上? 0.o – Androider 2012-02-06 07:20:31

0

我認爲你的問題是因爲你創建你不是在你的循環for循環這麼多的位圖。有一點肯定的是Android的設計,該內存可以精確地處理這樣的方式。既然你使用的是位圖列表,這並不意味着你將需要巨大的內存。您可以回收您的位圖或創建縮放的位圖,這將降低堆內存從而減少你的力接近的機會。

for (int i = 0; i < 34; i++) { 
     try { 
      Bitmap btm = BitmapFactory.decodeStream(manager.open("image.png")); 
      list.add(btm); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.d("Total ", Runtime.getRuntime().totalMemory()/1024f/1024f + ""); 
     Log.d("Free ", Runtime.getRuntime().freeMemory()/1024f/1024f + ""); 
    } 

在for循環加,btm.recycle();

for (int i = 0; i < 34; i++) { 
      try { 
       Bitmap btm = BitmapFactory.decodeStream(manager.open("image.png")); 
       list.add(btm); 
       btm.recycle(); 
       btm=null; 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Total ", Runtime.getRuntime().totalMemory()/1024f/1024f + ""); 
      Log.d("Free ", Runtime.getRuntime().freeMemory()/1024f/1024f + ""); 
     } 

這只是你一個建議可以在最優化的方式使用的內存。

並回答你的問題需要大量的內存 android不允許它。每個應用的可用內存因設備而異。如果你在這裏嘗試我的建議會更好。

+0

不,image.png只有30 kb,34x30 kb只有7 MB,爲什麼VM不讓我分配7MB? maxmemory是64 MB ... – Androider 2012-02-06 13:18:35

+0

但在運行時每個應用程序都受到限制。你說的總內存可能是64.我f和ororid需要內存,它會殺死可能正在運行的後臺應用程序。 – 2012-02-06 13:23:05