我需要大量内存,我尝试测试它:
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 + "");
我对此进行了测试并抛出了OutOfMemory(vm不允许为此应用程序分配超过5 MB的空间)
设备上的(例如Kindle Fire)max = 64 mb,total = 5mb free 2.3 mb,如果我使用超过5 mb(总内存)vm强制关闭。 是否可以将vm堆大小增加到MaxMemory(64)?
答案 0 :(得分:0)
您好,您需要使用Android虚拟设备管理器(AVD管理器)并单击编辑,您可以更改内存大小,这样您就可以腾出空间来运行您的应用程序。
答案 1 :(得分: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不允许它。每个应用程序的可用内存因设备而异。如果你在这里尝试我的建议会更好。