Ist es immer noch so, dass Android Klassen nie auslädt?

8

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

sagten
  

Klassen 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,

  1. Verwenden Sie für jede .jar-Datei ein neues DexClassLoader ,
  2. bezieht sich nur auf das Plugin über eine Referenz auf die Benutzeroberfläche und
  3. annullieren Sie alle Kopien dieser Schnittstellenreferenz, wenn Sie fertig sind.

Also habe ich einen Testfall erstellt:

  1. Ich habe ein paar triviale Plugins erstellt, die jeweils einen eigenen Loader verwenden.
  2. Ich habe ein 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.
  3. Ich habe in ähnlicher Weise eine 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.
  4. Ich erstelle tausend 1000x1000xARGB_8888 Bitmaps, um gc.
  5. gründlich zu erzwingen

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?

    
Jon Shemitz 17.09.2013, 01:53
quelle

1 Antwort

1

Die Dalvik VM entlädt immer noch keine Klassen. Die JNI-Tipps-Seite fördert gutes Verhalten, sodass Ihre App nicht kaputt geht, wenn die VM eines Tages Klassen entlädt.

    
fadden 21.09.2013, 05:49
quelle

Tags und Links