Моего simplified mail app работает отлично в течение более 1 года, но в последнее время, я начал получать некоторые ошибки отчета о OutOfMemoryError возникающего на Samsung SM-T530 matissewifi 5.0.2 устройства (т.е. Galaxy Tab 4 (10,1 «», Вай-фай)).Android IMAPFolder.fetch OutOfMemoryError: что я могу сделать по этому поводу?
фрагмент кода:
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
Я нашел расти() исходный метод: здесь (довольно просто):
public void grow(int incr)
{
byte[] nbuf = new byte[bytes.length + incr];
System.arraycopy(bytes, 0, nbuf, 0, bytes.length);
bytes = nbuf;
}
Manifest :
У меня уже есть
<application android:largeHeap="true">
в AndroidManifest.xml.
Вопросы:
Может ли это быть связано с почтового ящика, содержащего так много электронной почты, что сбой почты API с OOM исключением? Я только получаю ENVELOPPE (и еще несколько вещей), поэтому, полагаю, это не правильное объяснение.
Если, как я думаю, это НЕ связано с количеством электронной почты, что я могу сделать по этому поводу?
Также, как я должен интерпретировать сообщение OOM со значением для самых больших смежных байтов!?! (иногда бывает, но не всегда)
java.lang.OutOfMemoryError: Не удалось выделить 1036 байт с 8388608 байт и 385 МБ до OOM; не удалось из-за фрагментации (требуется continguous бесплатно 131072 байт для нового буфера, где наибольший непрерывный свободный байт)
папка закрыта и ссылки очищены, я уже встречался и исправлял такие проблемы в начале проекта. Об извлечении невидимых конвертов сообщений, только «многое» может объяснить ошибку, которая, как вы писали, действительно маловероятна. Получение дампа с устройства клиента ... может быть ... Я попытаюсь кое-что рассказать об этом. Спасибо за ваше время :-) – Pascal