Предполагаемая утечка памяти

#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 вы можете найти утечку, но ее можно локализовать.