Wir haben eine große App, die immer in das Grafenlimit der grauenhaften Methode läuft. Ich wurde gebeten, einen Weg zu finden, um es noch viel mehr zu tun, einschließlich der Unterstützung von Plugins. Auf der Suche nach Möglichkeiten, Code zu entladen, stieß ich auf JNI-Tipps , die
sagtenKlassen werden nur entladen, wenn alle Klassen einem ClassLoader zugeordnet sind kann Müll gesammelt werden, was selten ist, aber in nicht unmöglich sein wird Android.
Dies scheint zu implizieren, dass ein Plugin entladen werden kann, wenn Sie sagen,
DexClassLoader
, Also habe ich einen Testfall erstellt:
ReferenceQueue<ClassLoader>
erstellt und schwache Referenzen auf meine beiden Loader erstellt, die diese Warteschlange verwenden. Ich habe einen Thread erstellt / gestartet, der unendlich lange läuft, eine Warteschlange .remove()
erstellt und Berichte erstellt. ReferenceQueue<Class<?>>
erstellt und schwache Referenzen auf die getClass()
jedes Plugins mithilfe der Warteschlange erstellt. Ich habe einen anderen Thread erstellt / gestartet, der die Klassenreferenzwarteschlange überwacht. Meine Überwachungs-Threads scheinen zu funktionieren - ich habe loader2
gc-ed gesehen, wenn ich loader1
benutzt habe, um beide Plugins aus Versehen zu laden ;-), aber ansonsten bleiben meine Threads ruhig, sogar auf 4.3. Vermisse ich vielleicht etwas Offensichtliches in diesem Testfall oder ist es immer noch so, dass das
Dalvik VM entlädt derzeit keine Klassen
als Google-Mitarbeiter fadden sagt in Android: Wann werden Klassen vom System entladen?
Tags und Links android dexclassloader