【问题标题】:My android app leaks, what should I check?我的安卓应用程序泄漏,我应该检查什么?
【发布时间】:2012-06-19 14:23:25
【问题描述】:

我的安卓应用程序泄露,我应该检查什么?

我查看了avoiding memory leaks,并在活动的 onDestroy() 方法中添加了一些 unbindDrawables() 调用以进行清理,但没有任何改变。我还用 getApplicationContext() 替换了每个 getContext() 调用,但也没有任何改变。

我在 DDMS eclipse 透视图中监控堆大小:当我第一次启动应用程序时,分配了 3Mb,10 次关闭/重新启动后,分配了 10Mb。

我的视图主要由 ViewFlippers 和许多继承自 LinearLayout 子类的嵌套布局组成。

编辑:

运行 MAT 后发现泄漏嫌疑人的主要问题是:

16 instances of "org.apache.http.impl.conn.tsccm.ConnPoolByRoute", 
loaded by "<system class loader>" occupy 4,000,328 (44.08%) bytes.

【问题讨论】:

    标签: android android-layout memory-leaks


    【解决方案1】:

    如果你到处都在使用getApplicationContext(),那么你肯定是在泄漏内存!这通常是个坏主意。您需要在适当的地方使用适当的上下文。

    进行堆转储,使用分析器(如 MAT 或 jhat)并查看不应该存在的实例(应该被销毁的活动)。追溯参考链,找出它们没有被回收的原因。

    【讨论】:

    • 那是什么意思呢? "尝试使用上下文应用程序而不是上下文活动"
    • 如果您在应该使用活动上下文的地方使用应用程序上下文,那么您将泄漏内存,因为应用程序上下文应该只用于“长寿命”对象。没有规则说“如果你使用应用程序上下文,你就不会泄漏内存”
    • 如果您的 http 连接池中有 4MB,那么您可能没有正确关闭您的 http 连接以释放资源(缓冲区)。检查您正在使用 http 连接的所有位置是否正确关闭了连接。
    猜你喜欢
    • 2011-01-19
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多