我使用android工具"memory monitor"
来修复内存泄漏。它会有所帮助。
但是,我需要澄清一下。
运行应用程序后,分配的内存为“47MB”。当app与之交互时,它会上下移动。
然后当我点击"cause GC"
时,分配的内存下降到“30MB”。
如果我再次点击它,它会变为“17MB”。我的应用程序以17MB开始。
为什么我需要点击“导致GC”两次来回收所有内存?
或者这是意外的,我应该只点击一次?
答案 0 :(得分:2)
在每个周期之前和之后查看堆上的对象集可能会告诉您有关正在发生的事情的更多信息。这可能是由于GC政策决定(例如,世代收藏家没有扫描所有代),或者可能是由于对象相互引用的方式。
一种可能的情况与终结和本机指针有关。假设位图对象具有本机组件,并且该本机组件具有对另一个对象的JNI全局引用(可能是具有像素数据的byte[]
)。第一个GC将释放位图。 GC完成后不久,位图的终结器将运行,释放JNI全局引用。但是,byte[]
仍将在堆上,直到下一个GC通道注意到它不再被引用。
(这就是Skia图书馆实际处理的位图,直到" Ice Cream Sandwich"或其附近。)