Android 巨大内存(本机堆)增加布局设置
当我期望增加大约0.1MB时,本机堆的使用量增加了6MB 我是如何得出这些数字的:Android 巨大内存(本机堆)增加布局设置,android,android-layout,memory,Android,Android Layout,Memory,当我期望增加大约0.1MB时,本机堆的使用量增加了6MB 我是如何得出这些数字的: Log.d("test", "before setting layout"); showMemoryStats(); setContentView(R.layout.my_layout); Log.d("test", "after setting layout"); showMemoryStats(); 其中showMemory
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/测试(18647):设置布局前
2007-03 16:50:40.127:I/测试(18647):----------------------------------------------------------------------------------------------------------------------------
07-03 16:50:40.127:I/test(18647):在xx中显示内存统计信息
07-03 16:50:40.127:I/测试(18647):本地用法:5706008.0
2007-03 16:50:40.127:I/test(18647):heapSize:4905968.0
2007-03 16:50:40.127:I/test(18647):heapRemaining:1815456.0
07-03 16:50:40.127:I/测试(18647):内存可用:2.4757912E7
2007-03 16:50:40.127:I/测试(18647):----------------------------------------------------------------------------------------------------------------------------
2007-03 16:50:40.348:D/dalvikvm(18647):外部释放100K,49%释放2924K/5639K,外部0K/0K,暂停45ms
7-03 16:50:40.518:D/dalvikvm(18647):外部释放9K,49%释放2917K/5639K,外部2700K/3371K,暂停51ms
7-03 16:50:40.638:D/dalvikvm(18647):GC_外部所有释放4K,49%释放2928K/5639K,外部3952K/4356K,暂停51ms
2007-03 16:50:40.698:D/dalvikvm(18647):GC_EXTERNAL_ALLOC freed 2K,48%free 2933K/5639K,EXTERNAL 5963K/6027K,暂停24毫秒
07-03 16:50:40.718:D/测试(18647):设置布局后
07-03 16:50:40.718:I/测试(18647):----------------------------------------------------------------------------------------------------------------------------
07-03 16:50:40.718:I/test(18647):在xx中显示内存统计信息
07-03 16:50:40.718:I/测试(18647):本地用法:1.2101904E7
2007-03 16:50:40.718:I/测试(18647):治疗:4734944.0
2007-03 16:50:40.718:I/测试(18647):健康培训:1716432.0
07-03 16:50:40.718:I/测试(18647):内存可用:1.8434016E7
07-03 16:50:40.718:I/测试(18647):----------------------------------------------------------------------------------------------------------------------------
数学:
12101856字节-5703424字节=6398432字节=6.10202 mb
我浏览了我的布局文件,添加了所使用的所有绘图表的大小,总大小为124KB->0.121094MB
那么到底是什么导致本机堆增加了6MB呢
我可以把布局文件,如果有人要求它,不知道它是否有意义。。。只是一堆带有ID和可绘图的布局,如前所述,我已经检查了可绘图的大小
先谢谢你
编辑:就我而言,这就是解决方案——为了总结回复和评论:我将图像存储在“drawable”文件夹中,并使用hdpi设备。解决方案:将图像放入可绘制hdpi的文件夹中。原因:系统正在将我的图像从“可绘制”拉伸,以匹配hdpi分辨率,尽管它们已经处于hdpi分辨率。这使得它们占用的内存超过了应有的2倍。问题是,当android必须在屏幕上绘制您的绘图时,它们比在您的res文件夹中时大得多。例如,如果您有一个100 Kb的PNG,那么这就是压缩大小。当android在屏幕上绘制PNG时,它会将其放大到默认的正常大小(4字节)*(像素高度)*(像素宽度)。这是因为它为图像的每个像素存储4字节的颜色信息。这意味着,如果您的图像是800 x 600像素,android生成的结果位图是800x600x4字节=1920000字节=接近2MB的值
如果你想避开这个问题,你必须使用较小的图像。嗯,位图占用了大量的空间 每个像素需要4个字节 所以一个1M像素的图像是4MB!!!我假设您使用了许多较小的图像,但它们很快就会累加起来 一种解决方法是以较低的分辨率加载位图(在大多数情况下,您不会注意到任何差异,因为它们不会以最大分辨率显示)。为此,请查看
BitmapFactory.Options.inSampleSize
引用安卓的话
位图占用大量内存,特别是对于像这样的丰富图像
照片。例如,Galaxy Nexus上的相机会拍照
高达2592x1936像素(500万像素)。如果位图配置
使用的是ARGB_8888(Android 2.3以后的默认版本),然后
将此图像加载到内存大约需要19MB的内存(2592*1936*4
字节),立即耗尽某些设备上的每应用程序限制
.您是否正在使用可能需要更多内存的东西填充Drawable?你的抽屉是什么?图像或字段?可绘制文件是位图或XML文件,它们引用了按下/可绘制状态的位图。没别的了。填充:我正在填充动态数据,但在这些行之后。正如您所看到的,有一个输出,然后是setContentView,然后再次输出,中间没有其他内容。我明白了,很有趣。我会想办法的。当我前进一点时,回到这条线。。。现在,谢谢你+1@Ixx干杯解决方案在给定的链接中。特别是第一课。它有很棒的代码片段,我也可以用它来缩小图像。你传递你想要的图像大小,然后计算,然后使用<代码> BitmapFactory。选项。in SimulsEXIST/<代码>适当地缩小它。我还需要考虑循环和其他技巧,因为我将到处加载很多不同的东西…这只是开始。。。但是是的,缩小尺寸是个好主意,只要它看起来仍然完美,否则我会遇到问题…好的,我现在有一个480 x 800像素的png,这就是视图/屏幕大小(我将它用作活动的背景)。因此,在图像上是1:1像素,在图像上是1:1像素