小编ph4*_*r05的帖子

Android ClassLoader内存泄漏

动机:

我在我的Android应用程序中使用了一些本机库,我想在某个时间点将它们从内存中卸载.当加载了加载本机库的类的ClassLoader被垃圾收集时,库将被卸载.灵感:原生卸货.

问题:

  • 如果ClassLoader用于加载某个类(导致可能的内存泄漏),则不会对其进行垃圾回收.
  • 本机库只能在应用程序中的一个ClassLoader中加载.如果仍有旧的ClassLoader挂在内存中,并且新的ClassLoader尝试在某个时间点加载相同的本机库,则会抛出异常.

题:

  1. 如何以干净的方式执行本机库的卸载(卸载是我的最终目标,无论它是一种糟糕的编程技术还是类似的东西).
  2. 为什么会出现内存泄漏以及如何避免内存泄漏?

在下面的代码中,我通过省略本机库加载代码来简化案例,只演示了Classloader内存泄漏.

我在Android KitKat 4.4.2,API 19上测试了它.设备:Motorola Moto G.

为了演示,我有以下ClassLoader,派生自PathClassLoader用于加载Android应用程序.

package com.demo;
import android.util.Log;
import dalvik.system.PathClassLoader;

public class LibClassLoader extends PathClassLoader { 
   private static final String THIS_FILE="LibClassLoader";

   public LibClassLoader(String dexPath, String libraryPath, ClassLoader parent) {
        super(dexPath, libraryPath, parent);
    }

    @Override
    protected void finalize() throws Throwable {
        Log.v(THIS_FILE, "Finalizing classloader " + this);
        super.finalize();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有EmptyClass加载LibClassLoader.

package com.demo;
public class EmptyClass {
}
Run Code Online (Sandbox Code Playgroud)

内存泄漏是由以下代码引起的:

final Context …
Run Code Online (Sandbox Code Playgroud)

android garbage-collection memory-leaks classloader native-code

18
推荐指数
1
解决办法
1183
查看次数