巨大的内存(本机堆)增加了设置布局

时间:2012-07-03 15:17:01

标签: android android-layout memory

当我预计增加大约0.1 MB时,我的本机堆使用量会增加6 MB

我是如何得出这些数字的:

Log.d("test", "before setting layout");
showMemoryStats();

setContentView(R.layout.my_layout);

Log.d("test", "after setting layout");
showMemoryStats();

showMemoryStats是:

public static void showMemoryStats() {
    Log.i("test", "----------------------------------------------------------------------------------------------------------------------------");
    Log.i("test", "showing memory stats in xx");
    double nativeUsage = Debug.getNativeHeapAllocatedSize(); 
    Log.i("test", "nativeUsage: " + nativeUsage);
    //current heap size 
    double heapSize =  Runtime.getRuntime().totalMemory();
    Log.i("test", "heapSize: " + heapSize);
    //amount available in heap 
    double heapRemaining = Runtime.getRuntime().freeMemory();   
    Log.i("test", "heapRemaining: " + heapRemaining);
    double memoryAvailable = Runtime.getRuntime().maxMemory() - (heapSize - heapRemaining) - nativeUsage;
    Log.i("test", "memoryAvailable: " + memoryAvailable);
    Log.i("test", "----------------------------------------------------------------------------------------------------------------------------");
}

输出:

  

07-03 16:50:40.127:D / test(18647):在设置布局之前

     

07-03 16:50:40.127:I / test(18647):------------------------------- -------------------------------------------------- -------------------------------------------

     

07-03 16:50:40.127:I / test(18647):在xx中显示记忆统计数据

     

07-03 16:50:40.127:I / test(18647):nativeUsage:5706008.0

     

07-03 16:50:40.127:I / test(18647):heapSize:4905968.0

     

07-03 16:50:40.127:I / test(18647):heapRemaining:1815456.0

     

07-03 16:50:40.127:I / test(18647):memoryAvailable:2.4757912E7

     

07-03 16:50:40.127:I / test(18647):------------------------------- -------------------------------------------------- -------------------------------------------

     

07-03 16:50:40.348:D / dalvikvm(18647):GC_EXTERNAL_ALLOC释放100K,49%免费2924K / 5639K,外部0K / 0K,暂停45ms

     

07-03 16:50:40.518:D / dalvikvm(18647):GC_EXTERNAL_ALLOC释放9K,49%免费2917K / 5639K,外部2700K / 3371K,暂停51ms

     

07-03 16:50:40.638:D / dalvikvm(18647):GC_EXTERNAL_ALLOC释放4K,49%免费2928K / 5639K,外部3952K / 4356K,暂停51ms

     

07-03 16:50:40.698:D / dalvikvm(18647):GC_EXTERNAL_ALLOC释放2K,48%免费2933K / 5639K,外部5963K / 6027K,暂停24ms

     

07-03 16:50:40.718:D / test(18647):设置布局后

     

07-03 16:50:40.718:I / test(18647):------------------------------- -------------------------------------------------- -------------------------------------------

     

07-03 16:50:40.718:I / test(18647):在xx中显示记忆统计数据

     

07-03 16:50:40.718:I / test(18647):nativeUsage:1.2101904E7

     

07-03 16:50:40.718:I / test(18647):heapSize:4734944.0

     

07-03 16:50:40.718:I / test(18647):heapRemaining:1716432.0

     

07-03 16:50:40.718:I / test(18647):memoryAvailable:1.8434016E7

     

07-03 16:50:40.718:I / test(18647):------------------------------- -------------------------------------------------- -------------------------------------------

数学:

12101856字节 - 5703424字节= 6398432字节= 6.10202 mb

我浏览了我的布局文件,并添加了所有使用的drawable的大小,总大小为124 kb - > 0.121094 mb

那么究竟是什么导致本机堆增加了6 MB?

我可以放置布局文件,如果有人要求它,不知道它是否有意义...只是一堆带有id和drawables的布局,并且如上所述我已经检查了drawables的大小。 / p>

提前多多感谢...

编辑:在我的情况下,这是解决方案 - 为了总结回复和评论:我将图像存储在“drawable”文件夹中并使用hdpi设备。解决方案:将图像放在drawable-hdpi文件夹中。原因:系统正在从“可绘制”中拉伸我的图像以匹配hdpi分辨率,尽管它们已经处于hdpi分辨率。这使得它们占用的内存超过了应有的2倍。

2 个答案:

答案 0 :(得分:1)

问题是,当android必须在屏幕上绘制你的drawable时,它们比你在res文件夹中的大得多。如果你有一个100 Kb的PNG,那么这就是压缩的大小。当android在屏幕上绘制PNG时,它会将其上升到正常大小,默认情况下为4(字节)*(像素高度)*(像素宽度)。这是因为它为图像的每个像素存储4字节的颜色信息。这意味着如果您的图像是800 x 600像素,那么android生成的结果位图是800x600x4字节= 1920000字节=接近2 Mb。

如果你想解决这个问题,你必须使用较小的图像。

答案 1 :(得分:1)

嗯,Bitmaps需要占用大量空间。

每个像素需要4个字节!

所以一个1M像素的图像是4MB!我假设你正在使用许多较小的图像,但它们很快就会加起来。

解决此问题的一种方法是以较低的分辨率加载位图(在大多数情况下,您不会注意到任何差异,因为它们无论如何都不会以最大分辨率显示)。请查看BitmapFactory.Options.inSampleSize

引自android

  

Bitmaps会占用大量内存,特别是对于像这样的丰富图像   照片。例如,Galaxy Nexus上的相机拍照   高达2592x1936像素(5百万像素)。如果是位图配置   使用的是ARGB_8888(默认来自Android 2.3以后)   将此图像加载到内存大约需要19MB内存(2592 * 1936 * 4   字节),立即耗尽某些设备上的每应用限制。

Here is a great link to explain it better