在这个问题上花了3天时间,我很困惑,真的需要你的帮助。
我的应用程序使用一个包含片段管理器的活动。在它当前的状态下,我设计它在任何时候都只附加一个片段。我呼吁:
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mCurrent).commit();移除现有片段,并将其替换为新片段。碎片不在其他地方储存。(只有mCurrent和在打开下一个片段时被替换的事务管理器)
出现的问题不是OutOfMemory异常,而是整个应用程序重新启动,因为设备本身内存不足。日志中除了DeadObjectException之类的内容外什么也没有说:
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上。
问题:
耽误您时间,实在对不起。
发布于 2013-12-12 16:36:55
我发现了我记忆泄露的主要原因。它通过创建一个Process对象并打开输入和输出流来执行shell命令。我用这个来探测有根的设备。我对Process类的了解还不够,无法解释为什么会导致泄漏(我现在将阅读它),但是如果您使用的代码与此类似,我将对此问题保持警惕。
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;
}发布于 2013-09-19 14:19:09
本机代码中的内存泄漏可能会产生您所描述的症状:系统内存缓慢流失,而应用程序的内存占用(如JVM所看到的)大致保持不变。
我建议仔细查看本机代码中的内存分配,并验证是否正在清理每个内存。这包括对malloc的调用,堆上创建的任何对象(例如,带有"new"),等等。有一些工具支持使用DDMS分析本地分配--参见this answer。
发布于 2013-10-07 21:23:48
通过进一步的分析,我可以推断出我的内存泄漏有三个主要问题:
这并没有解决我的网页浏览问题,但也许它会解决其他人的问题。我还在继续寻找问题。我的场景包括多个片段,每个片段都有一个with视图,可以使用with视图打开其他片段。
我希望这对其他人有所帮助,我花了一个多月的时间来调试导致泄漏的所有不同的场景,因为我最初并不认为有很多原因。祝好运。像往常一样感谢社区。
https://stackoverflow.com/questions/18883017
复制相似问题