2016-10-21 2 views
0

Моего 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 байт для нового буфера, где наибольший непрерывный свободный байт)

ответ

0

Конечно, вы должны убедиться, что вы закрываете папки, когда вы закончите с ними, и не сохраняя ссылки на папки или сообщения, которые вы больше не используете. И убедитесь, что все остальные части вашего приложения не вызывают утечки памяти.

Ответ на запрос Folder.fetch должен храниться в одном байтовом массиве. Вы можете увидеть, как растет массив байтов. По сравнению с фактическим содержанием сообщений информация об извлечении обычно довольно мала. Но если у вас тысячи и тысячи сообщений, это может стать большим. Поскольку вы ищете только невидимые сообщения, кажется маловероятным, что это так.

Я не знаю, что возможно на Android, но если вы можете получить кучу дампа, когда это произойдет, и проверьте его, чтобы определить, какие объекты используют всю память, которая была бы наиболее полезной.

+0

папка закрыта и ссылки очищены, я уже встречался и исправлял такие проблемы в начале проекта. Об извлечении невидимых конвертов сообщений, только «многое» может объяснить ошибку, которая, как вы писали, действительно маловероятна. Получение дампа с устройства клиента ... может быть ... Я попытаюсь кое-что рассказать об этом. Спасибо за ваше время :-) – Pascal

Смежные вопросы