我正在使用Eclipse的Memory Analyzer来分析我的应用程序的堆转储,因为我认为我在某处遇到了内存泄漏。我不太确定该寻找什么,但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),但不超过1MB。此代码是解析大约5-6个xml文件的循环的一部分。
任何关于“问题可疑”是什么的见解,如果它们导致内存泄漏以及修复它的方法,都将非常感激。
答案 0 :(得分:3)
问题嫌疑人就是这样:第一个寻找内存泄漏的地方。它们是对象类型的应用程序中内存的最大用途。您很可能没有内存泄漏,但您可以通过首先查看这些对象来尝试减少内存使用量。
以下是一些包含更多信息的资源
答案 1 :(得分:0)
你是对的:看到并消除泄漏 - 两件事。如果有紧急需求 - 有了帮助Deleaker你可以找到泄漏,但它可以被本地化。