当我预计增加大约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倍。
答案 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 字节),立即耗尽某些设备上的每应用限制。