修改
我再也看不到这个OOM错误了。这可能与应用程序中其他地方的一些内存泄漏有关:我发现一个可能的Activity泄漏:这可能是罪魁祸首, JavaMail与此活动泄漏无关......我的错误。< / p>
我的simplified mail app工作正常超过1年,但最近,我开始收到关于 OutOfMemoryError 的错误报告三星SM-T530 matissewifi 5.0.2 设备(即Galaxy Tab 4(10.1'',Wi-Fi))。
代码摘录:
try
{
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
Message[] messages = folder.search(ft);
folder.fetch(messages, createFetchProfile());
return messages;
}
catch (Throwable th)
{
// I got OutOfMemoryError here because of folder.fetch(...):
/*
java.lang.OutOfMemoryError: Failed to allocate a 1036 byte allocation with 8388608 free bytes and 387MB until OOM; failed due to fragmentation (required continguous free 131072 bytes for a new buffer where largest contiguous free 65536 bytes)
or even this (with !0! for largest contiguous free bytes value!!!)
java.lang.OutOfMemoryError: Failed to allocate a 1036 byte allocation with 8388608 free bytes and 385MB until OOM; failed due to fragmentation (required continguous free 131072 bytes for a new buffer where largest contiguous free 0 bytes)
at com.sun.mail.iap.ByteArray.grow(SourceFile:161)
at com.sun.mail.iap.ResponseInputStream.readResponse(SourceFile:125)
at com.sun.mail.iap.Response.(SourceFile:121)
at com.sun.mail.imap.protocol.IMAPResponse.(SourceFile:66)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(SourceFile:458)
at com.sun.mail.iap.Protocol.command(SourceFile:414)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(SourceFile:2440)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(SourceFile:2422)
at com.sun.mail.imap.IMAPFolder.fetch(SourceFile:1417)
at <mycode...>
*/
}
fetchprofile是
FetchProfile fetchProfile = new FetchProfile();
fetchProfile.add(UIDFolder.FetchProfileItem.ENVELOPE);
// fetch other info to speed up process
fetchProfile.add(UIDFolder.FetchProfileItem.FLAGS);
fetchProfile.add(UIDFolder.FetchProfileItem.UID);
fetchProfile.add(UIDFolder.FetchProfileItem.CONTENT_INFO);
fetchProfile.add(UIDFolder.FetchProfileItem.SIZE); // not sure about this one
我找到了grow()方法来源:这里(非常简单):
public void grow(int incr)
{
byte[] nbuf = new byte[bytes.length + incr];
System.arraycopy(bytes, 0, nbuf, 0, bytes.length);
bytes = nbuf;
}
清单:
我已经
了<application android:largeHeap="true">
AndroidManifest.xml中的。
问题:
这是否与包含太多电子邮件的邮箱有关,邮件API因OOM异常而崩溃?我只提取ENVELOPPE(和其他一些东西),所以我想这不是正确的解释。
如果我认为它与电子邮件数量无关,我该怎么办呢?
另外,对于最大的连续字节,我应该如何解释值 0 的OOM消息!?! (有时会发生,但并非总是如此)
java.lang.OutOfMemoryError:在OOM之前无法分配带有8388608个空闲字节和385MB的1036字节分配; 由于碎片而失败(对于新缓冲区需要连续的131072字节,其中最大的连续空闲 0 字节)
答案 0 :(得分:0)
当然,您应该确保在完成文件夹时关闭文件夹,而不是保留对您不再使用的文件夹或邮件的引用。并确保应用程序的所有其他部分都不会导致内存泄漏。
Folder.fetch响应需要保存在单个字节数组中。您可以看到字节数组如何增长。与消息的实际内容相比,获取信息通常非常小。但是,如果你有成千上万的消息,它可能会变大。由于你只是在寻找看不见的消息,所以情况似乎不太可能。
我不知道在Android上有什么可能但是如果你在发生这种情况时可以获得堆转储并检查它以确定哪些对象正在使用最有用的所有内存。