#android #memory-leaks #memory-management
#Android #утечки памяти #управление памятью
Вопрос:
Я использую анализатор памяти Eclipse для анализа дампа кучи для моего приложения, так как я думаю, что где-то произошла утечка памяти. Я не совсем уверен, что искать, но отчет о подозрении на утечку в MAT показывает 4 «подозреваемых проблемы», которые:
The class "org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl", loaded by "<system class loader>", occupies 608,976 (16.15%) bytes. The memory is accumulated in one instance of "java.util.jar.JarFile" loaded by "<system class loader>".
One instance of "org.apache.harmony.xml.ExpatParser" loaded by "<system class loader>" occupies 501,304 (13.29%) bytes. The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".
127 instances of "org.bouncycastle.jce.provider.X509CertificateObject", loaded by "<system class loader>" occupy 451,280 (11.97%) bytes. These instances are referenced from one instance of "java.util.Hashtable$HashtableEntry[]", loaded by "<system class loader>"
6,608 instances of "java.lang.String", loaded by "<system class loader>" occupy 407,824 (10.81%) bytes.
Последнее, что я предполагаю, это то, что я использую слишком много строк? Об остальных я понятия не имею. Я не использую никакого шифрования, поэтому я не знаю, почему отображается BouncyCastle.
Единственный код, о котором я могу думать, который вызывает «подозреваемых», это:
final InputStream stream = new URL(feedUrl).openConnection().getInputStream();
Xml.parse(stream, Xml.Encoding.UTF_8, root.getContentHandler());
stream.close();
Я анализирую некоторые удаленные XML-файлы (используя SAX) разного размера, но не более 1 МБ. Этот код является частью цикла, который анализирует около 5-6 xml-файлов.
Мы были бы весьма признательны за любую информацию о том, что такое «предполагаемые проблемы», вызывают ли они утечку памяти и способ ее устранения.
Ответ №1:
Подозреваемая проблема заключается именно в этом: первое место для поиска утечек памяти. Это самые популярные варианты использования памяти в вашем приложении по типу объекта. Вполне возможно, что у вас нет утечек памяти, но вы можете попытаться уменьшить использование памяти в целом, сначала просмотрев эти объекты.
Вот несколько ресурсов с дополнительной информацией
Ответ №2:
вы правы: видеть и устранять утечки — две разные вещи. Если есть срочная необходимость — с помощью Deleaker вы можете найти утечку, но ее можно локализовать.