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

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

当我期望增加大约0.1MB时,本机堆的使用量增加了6MB

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

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像素