Как Android может утечь память, когда память приложения остается стабильной - PullRequest
2 голосов
/ 13 сентября 2011

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

Как телефон Android может исчерпать память, если объем памяти, используемый его приложениями, остается почти постоянным?

Следующая строка кода возвращает почти постоянное значение от 4 до 5 МБ, но диспетчер приложений Android показывает, что работающее приложение теряет около 1 мегабайта за итерацию, и через некоторое время Android начинает закрывать процесс из-за нехватки памяти.

(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())

Я вижу похожие результаты, когда использую Eclipse Memory Analyzer Tool для просмотра HPROF или в Android-инструменте Heap для просмотра кучи. Я также не видел огромного блока памяти, выделяемого в Android Allocation Tracker.

Итак, большие вопросы для меня: 1) Как может быть не синхронизирована память в приложении и память в Android? 2) Я в полной мере отдаю должное указателям, которые помогут мне преодолеть эту утечку памяти в тестовом коде. (Я рад предоставить полный тестовый код.)

//This is an excerpt from the case.
import es.vocali.util.AESCrypt;  
import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  

...  

byte[] data = getData(ONE_MEGABYTE);  
AESCrypt aesCrypt = new AESCrypt(PASSWORD);  
ByteArrayOutputStream baos = new ByteArrayOutputStream(ONE_MEGABYTE+ONE_KILOBYTE);  

//Each iteration leaks approximately ONE_MEGABYTE  
for(int i = 0; i < NUMBER_OF_ENCRYPTIONS; i++) {  
    ByteArrayInputStream bais = new ByteArrayInputStream(data);  
    aesCrypt.encrypt(2, bais, baos);  
    bais.close();  
    bais = null;  
    baos.reset();  
}
...