Android的虚拟机总内存的最大内存

问题描述:

我需要的内存大的量,我尝试测试: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)?

你好,你需要去Android虚拟设备管理器(AVD管理器),然后单击编辑那里你可以更改内存大小,从而可以使运行您的应用空间。

+0

我正在编写的应用程序将工作在我需要模拟器的所有设备上? 0.o – Androider 2012-02-06 07:20:31

我认为你的问题是因为你创建你不是在你的循环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