gpt4 book ai didi

Apache Harmony 的 JarURLConnectionImpl 中的 Android 内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:43 24 4
gpt4 key购买 nike

我正在开发一款 Android 应用,我们正在调查内存使用情况。

查看来自 hprof 的堆转储,我们看到将近 2M(我们堆的 22%)被用于 JarURLConnectionImpl 的静态缓存中:

enter image description here

查看 source code for JarURLConnectionImpl ,似乎条目已添加到静态 jarCache 变量,但从未删除。

如果它们确实从未被删除,那我认为这是潜在的内存泄漏。

这是泄漏吗?是否有修复或解决方法?

最佳答案

这是一个丑陋的解决方法:

private static HashMap<URL,JarFile> jarCache;


static {
try {
Class<?> jarURLConnectionImplClass = Class.forName("org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl");
final Field jarCacheField = jarURLConnectionImplClass.getDeclaredField("jarCache");
jarCacheField.setAccessible(true);
//noinspection unchecked
jarCache = (HashMap<URL, JarFile>) jarCacheField.get(null);
} catch(Exception e) {
// ignored
}
}

然后,定期运行以下命令:

    // HACK http://stackoverflow.com/questions/14610350/android-memory-leak-in-apache-harmonys-jarurlconnectionimpl
if( jarCache!=null ) {
try {
for (
final Iterator<Map.Entry<URL, JarFile>> iterator = jarCache.entrySet().iterator(); iterator.hasNext(); ) {
final Map.Entry<URL, JarFile> e = iterator.next();
final URL url = e.getKey();
if (Strings.toString(url).endsWith(".apk")) {
Log.i(TAG,"Removing static hashmap entry for " + url);
try {
final JarFile jarFile = e.getValue();
jarFile.close();
iterator.remove();
} catch( Exception f ) {
Log.e(TAG,"Error removing hashmap entry for "+ url,f);
}
}
}
} catch( Exception e ) {
// ignored
}
}

我在创建 Activity 时运行它,因此每次创建我的 Activity 时都会执行它。丑陋的 hashmap 条目似乎并不经常重新创建,但它似乎偶尔会重新出现,因此仅运行此代码一次是不够的。

关于Apache Harmony 的 JarURLConnectionImpl 中的 Android 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com