首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android设备内存泄漏与碎片

Android设备内存泄漏与碎片
EN

Stack Overflow用户
提问于 2013-09-18 21:54:25
回答 3查看 2.7K关注 0票数 2

在这个问题上花了3天时间,我很困惑,真的需要你的帮助。

我的应用程序使用一个包含片段管理器的活动。在它当前的状态下,我设计它在任何时候都只附加一个片段。我呼吁:

代码语言:javascript
复制
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mCurrent).commit();

移除现有片段,并将其替换为新片段。碎片不在其他地方储存。(只有mCurrent和在打开下一个片段时被替换的事务管理器)

出现的问题不是OutOfMemory异常,而是整个应用程序重新启动,因为设备本身内存不足。日志中除了DeadObjectException之类的内容外什么也没有说:

代码语言:javascript
复制
9-17 11:34:14.742: W/InputDispatcher(341): channel ~ Consumer closed input channel or an error occurred.  events=0x9

09-17 11:34:14.742: E/InputDispatcher(341): channel ~ Channel is unrecoverably broken and will be disposed!

这些来自设备日志,而不是我的应用程序日志。他们没有提供足够的信息让我追踪是什么原因造成的。应用程序中的内存从未被释放,从那时起,平板电脑就无法使用了。

我已经使用了我所知道的所有工具来分析内存泄漏是什么,但没有什么特别之处。我使用MAT (MemoryAnalyzerTool)和Eclipse工具来找出可能出了什么问题。在访问了许多不同的片段之后,MAT报告了在使用中的8MB-16 8MB内存之间。我看了看泄密报告,没有什么不寻常的。图像视图约为3MB,位图为3MB,其他为8MB。在DDMS中,堆显示我使用了应用程序分配大小的大约50%。当我查看正在运行的进程中的设置时,我访问的每个片段都会使我的应用程序中的内存量在30-140 my之间波动,但是设备本身的内存从未减少,这就是为什么设备会耗尽内存。即使应用程序被完全关闭、退出、销毁,内存也从未被释放。所有759 is都被使用,尽管所有当前运行的应用程序之和约为200-300MB。

我的假设是,它要么将片段本身保存在内存中,要么包含在这些片段中,即使我的应用程序不是。我在每个片段交换后调用GC。

我正在使用三星GalaxyTab210.1“,但同样的问题发生在摩托罗拉Xoom上。

问题:

  1. 有人经历过这种行为吗?
  2. 有人能给我提供任何其他工具的方向来帮助我研究可能的内存泄漏吗?
  3. 是否有一个系统进程可以让我详细展示设备内存是如何分配的?

耽误您时间,实在对不起。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-12 16:36:55

我发现了我记忆泄露的主要原因。它通过创建一个Process对象并打开输入和输出流来执行shell命令。我用这个来探测有根的设备。我对Process类的了解还不够,无法解释为什么会导致泄漏(我现在将阅读它),但是如果您使用的代码与此类似,我将对此问题保持警惕。

代码语言:javascript
复制
public static enum SHELL_COMMAND
{
    check_su_binary(new String[] { "/system/xbin/which", "su" }), ;
    String[] command;

    SHELL_COMMAND(String[] command)
    {
        this.command = command;
    }
}

/**
 * @param shellCommand
 * @return
 */
public List<String> executeCommand(SHELL_COMMAND shellCommand)
{
    //this code was causing my memory leak
    try
    {
        String line = null;
        List<String> fullResponse = new ArrayList<String>();
        Process localProcess = Runtime.getRuntime().exec(shellCommand.command);

        OutputStreamWriter writer = new OutputStreamWriter(localProcess.getOutputStream());
        BufferedWriter bufferedWriter = new BufferedWriter(writer);

        InputStreamReader reader = new InputStreamReader(localProcess.getInputStream());
        BufferedReader in = new BufferedReader(reader);

        while ((line = in.readLine()) != null)
        {
            fullResponse.add(line);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    try
    {
        bufferedWriter.close();
        bufferedWriter = null;
        writer.close();
        writer = null;

        in.close();
        in = null;
        reader.close();
        reader = null;
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    return fullResponse;
}
票数 0
EN

Stack Overflow用户

发布于 2013-09-19 14:19:09

本机代码中的内存泄漏可能会产生您所描述的症状:系统内存缓慢流失,而应用程序的内存占用(如JVM所看到的)大致保持不变。

我建议仔细查看本机代码中的内存分配,并验证是否正在清理每个内存。这包括对malloc的调用,堆上创建的任何对象(例如,带有"new"),等等。有一些工具支持使用DDMS分析本地分配--参见this answer

票数 0
EN

Stack Overflow用户

发布于 2013-10-07 21:23:48

通过进一步的分析,我可以推断出我的内存泄漏有三个主要问题:

  1. 我最初将所有UI创建代码放在重写的onStart方法中,因为我不清楚它的适当位置(onStart与onCreateView)。我将所有UI代码移到onCreateView中(与this.getView() ->相关的任何内容都使用onCreateView中的充气器)。这似乎消除了每次我打开和关闭应用程序时发生的内存泄漏。以下是一条建议: @重写公共视图onCreateView(LayoutInflater inflater,ViewGroup容器,Bundle savedInstanceState) { View v= inflater.inflate(R.layout.fragment_one,容器,false);//这里使用"v“返回v;}的UI代码
  2. 我使用一个ViewPager来存放我的所有片段(这是因为我需要特定类型的导航)。我将其转换为使用自定义片段管理解决方案。我建议使用碎片事务管理器(我最初认为是碎片管理器导致了泄漏,但似乎并非如此)。这并没有造成泄漏,而是消耗了大量的内存。
  3. WebViews也是内存泄漏的一个重要原因(因为它在整个互联网上都有很好的记录)。我尝试使用发布的解决方案,即将webview封装在容器中,并销毁webview及其容器(以下是代码) @重写公共无效onDestroy() { super.onDestroy();if (mWebContainer != null) mWebContainer.removeAllViews();if (mWebView = null) {mWebView.loadUrl(“约:空白”);mWebView.destroy();mWebView = null;}}

这并没有解决我的网页浏览问题,但也许它会解决其他人的问题。我还在继续寻找问题。我的场景包括多个片段,每个片段都有一个with视图,可以使用with视图打开其他片段。

我希望这对其他人有所帮助,我花了一个多月的时间来调试导致泄漏的所有不同的场景,因为我最初并不认为有很多原因。祝好运。像往常一样感谢社区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18883017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档