android vm总内存到最大内存

时间:2012-02-06 07:08:44

标签: 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 + "");

我对此进行了测试并抛出了OutOfMemory(vm不允许为此应用程序分配超过5 MB的空间)

设备上的

(例如Kindle Fire)max = 64 mb,total = 5mb free 2.3 mb,如果我使用超过5 mb(总内存)vm强制关闭。 是否可以将vm堆大小增加到MaxMemory(64)?

2 个答案:

答案 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不允许它。每个应用程序的可用内存因设备而异。如果你在这里尝试我的建议会更好。