【问题标题】:Strange app memory management奇怪的应用内存管理
【发布时间】:2014-06-19 10:57:45
【问题描述】:

我正在开发一个 Android 应用程序,我认为它的行为非常罕见。当我启动应用程序时,通过按后退按钮离开它并检查 Android 应用程序管理器的缓存后台进程部分,它显示我的应用程序的缓存后台进程正在消耗大约 10 MB 的 RAM。好吧,这看起来很正常,但是,每次我再次打开它并通过按返回按钮关闭它然后检查应用程序的内存消耗它总是增加约 800 kB,这意味着如果我打开我的应用程序 10 次并检查它的内存我看到它现在消耗 10 MB + 10 * 800 kB = 18 MB。每次重新启动应用程序的主要活动时,内存消耗都会增加(这意味着当我也旋转屏幕时),直到它达到 ~28 MB,然后下降到 ~23 MB,然后独立地保持在 23 到 28 MB 之间多少次我打开它。这是正常的还是我应该怀疑内存泄漏?

【问题讨论】:

    标签: android memory memory-management android-activity memory-leaks


    【解决方案1】:

    我建议您阅读这篇文章,了解如何使用 MAT 分析您的应用程序的内存消耗。 http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html?m=1 这帮助我之前发现了漏洞。

    我见过的两个最常见的错误: 1. 长期存在的上下文引用(例如,持有您活动的引用的东西) 2.位图处理

    【讨论】:

    • 嗯,我不认为有什么东西可以引用我的活动,因为我从我的活动中启动的唯一东西是一个片段,它与我的活动一起被销毁,所以它不能当它被破坏时没有参考。或者可以吗?我在日志中看到我的活动和片段的 onDestroy() 方法都被调用了。而且我确定我没有使用任何位图。
    • 我并不是说我怀疑内存泄漏。我只是问我是否应该担心我的应用程序的这种行为。 RAM 消耗随着我的应用程序的主要活动的每次娱乐而增加,直到它达到某个点,然后在那里上下移动几 MB。
    • 我不知道您所说的“自定义视图与非库存视图一样”究竟是什么意思,但是是的,我使用了几个小的 9 补丁图像。但是您的意思是在我退出活动后应该立即对未使用的对象进行 GC 处理吗?也许他们只有在内存使用达到特定点时才会被 GCed?就我而言,正如我在问题中提到的那样,它大约是 28 MB,因为这样内存就会下降一点。顺便说一句,如果我不使用它,我的应用程序会在一段时间后从内存中完全清除。所以这可能意味着没有保留的引用。
    • 我的意思是自定义视图:developer.android.com/training/custom-views/index.html。无论如何,当您旋转屏幕时,内存消耗会增加,因为应用程序必须计算如何缩放图像(“隐藏图像处理”),因此它将消耗更多的堆空间。当您可以用可绘制对象替换 9 补丁时,我注意到性能显着提高。我最近写了一个关于如何用 android 自定义可绘制对象替换图像的简短示例。 novarata.com/look-ma-no-images.
    • 不,我没有使用那种视图。但是,我喜欢您关于用可绘制对象替换图像的想法。当我有空闲时间时,我可能会尝试用 drawables 替换我用于自定义选项卡布局的 9 个补丁。但首先我必须找到内存泄漏或导致我的应用程序内存管理异常的原因。
    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多