为什么本地堆内存在方向更改时会不断增加?

时间:2011-12-22 13:59:31

标签: android

我做了一个演示活动。即一个带有布局和TextView的简单Activity。

我用过

Log.e(kFileString, "Native Heap Allocated Size = "
    + Debug.getNativeHeapAllocatedSize());
Log.e(kFileString, "Native Heap Free Size = "
    + Debug.getNativeHeapFreeSize());
Log.e(kFileString, "Native Heap SIZE = " + Debug.getNativeHeapSize());

用于记录分配的本机堆。

我注意到每次更改方向时,分配的本机堆都会增加。

有人可以告诉我为什么会发生这种情况,以及是否有关于Android本机堆管理的文档?

3 个答案:

答案 0 :(得分:3)

我刚刚运行了一个示例应用程序,并在onCreate()添加了日志行的情况下多次更改了方向。

它继续分配越来越多的堆内存但是一旦垃圾收集器运行,我又回到了几乎相同的堆大小。

这是日志输出:

12-22 15:35:04.403: D/ISA(15592): Native Heap Allocated Size = 5720352
12-22 15:35:04.423: D/ISA(15592): Native Heap Free Size = 9952
12-22 15:35:04.433: D/ISA(15592): Native Heap SIZE = 5730304
12-22 15:35:15.764: D/ISA(15592): Native Heap Allocated Size = 5802312
12-22 15:35:15.764: D/ISA(15592): Native Heap Free Size = 9912
12-22 15:35:15.774: D/ISA(15592): Native Heap SIZE = 5812224
12-22 15:35:19.558: D/ISA(15592): Native Heap Allocated Size = 5821688
12-22 15:35:19.568: D/ISA(15592): Native Heap Free Size = 11016
12-22 15:35:19.568: D/ISA(15592): Native Heap SIZE = 5832704
12-22 15:35:22.941: D/ISA(15592): Native Heap Allocated Size = 5841120
12-22 15:35:22.941: D/ISA(15592): Native Heap Free Size = 12064
12-22 15:35:22.951: D/ISA(15592): Native Heap SIZE = 5853184
12-22 15:35:25.243: D/ISA(15592): Native Heap Allocated Size = 5860416
12-22 15:35:25.243: D/ISA(15592): Native Heap Free Size = 9152
12-22 15:35:25.243: D/ISA(15592): Native Heap SIZE = 5869568
12-22 15:35:28.316: D/ISA(15592): Native Heap Allocated Size = 5879752
12-22 15:35:28.316: D/ISA(15592): Native Heap Free Size = 10296
12-22 15:35:28.316: D/ISA(15592): Native Heap SIZE = 5890048
12-22 15:35:30.568: D/ISA(15592): Native Heap Allocated Size = 5899064
12-22 15:35:30.568: D/ISA(15592): Native Heap Free Size = 11464
12-22 15:35:30.568: D/ISA(15592): Native Heap SIZE = 5910528
12-22 15:35:32.300: D/ISA(15592): Native Heap Allocated Size = 5918416
12-22 15:35:32.300: D/ISA(15592): Native Heap Free Size = 12592
12-22 15:35:32.300: D/ISA(15592): Native Heap SIZE = 5931008
12-22 15:35:34.262: D/ISA(15592): Native Heap Allocated Size = 5937696
12-22 15:35:34.272: D/ISA(15592): Native Heap Free Size = 9696
12-22 15:35:34.282: D/ISA(15592): Native Heap SIZE = 5947392
12-22 15:35:36.194: D/ISA(15592): Native Heap Allocated Size = 5956976
12-22 15:35:36.204: D/ISA(15592): Native Heap Free Size = 10896
12-22 15:35:36.204: D/ISA(15592): Native Heap SIZE = 5967872
12-22 15:35:37.455: D/ISA(15592): Native Heap Allocated Size = 5976216
12-22 15:35:37.455: D/ISA(15592): Native Heap Free Size = 12136
12-22 15:35:37.455: D/ISA(15592): Native Heap SIZE = 5988352
12-22 15:35:39.387: D/ISA(15592): Native Heap Allocated Size = 5995496
12-22 15:35:39.387: D/ISA(15592): Native Heap Free Size = 13336
12-22 15:35:39.387: D/ISA(15592): Native Heap SIZE = 6008832
12-22 15:35:41.129: D/ISA(15592): Native Heap Allocated Size = 6018880
12-22 15:35:41.139: D/dalvikvm(1606): GC_CONCURRENT freed 1769K, 51% free 4277K/8583K, external 4127K/5154K, paused 18ms+14ms
12-22 15:35:41.139: D/ISA(15592): Native Heap Free Size = 14528
12-22 15:35:41.139: D/ISA(15592): Native Heap SIZE = 6033408
12-22 15:35:47.055: D/ISA(15592): Native Heap Allocated Size = 5829472
12-22 15:35:47.065: D/ISA(15592): Native Heap Free Size = 199840
12-22 15:35:47.065: D/ISA(15592): Native Heap SIZE = 6033408

答案 1 :(得分:-1)

您可以使用eclipse中的DDMS工具,转到堆选项卡并选择“Cause GC” 这将调用垃圾收集器,导致所有未引用的变量从内存中删除。 之后,您可以将内存与初始状态进行比较。

关于Activity休闲期间的内存增加,可能是由于 持有对前一个活动的引用,以防止它被垃圾收集。 确保没有任何静态对象直接或间接引用活动。

答案 2 :(得分:-2)

你有内存泄漏:

  

当屏幕方向改变时,系统默认会销毁当前活动并在保留其状态的同时创建一个新活动。这样,Android将从资源重新加载应用程序的UI。现在假设您编写了一个带有大位图的应用程序,您不希望在每次轮换时加载该位图。保持它并且不必在每次旋转时重新加载它的最简单方法是保持静态字段:

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html