Frage

ich eine Android-Aktivität und ein Dienst implementiert AIDL verwenden. Arbeiten wie ein Weltmeister, ich habe einen Rückruf Setup einige Thread Meldungen zurück an die UI passieren, und das erscheint zu funktionieren, mit Ausnahme von vielen

hat GREF auf 101 erhöht, 201301401, 501 .. etc, und GREF verringert hat. Ich habe einige Online-Suche und fand, dass es w / Globale Referenzen zu tun hat.

08-17 02:31:19.735: DEBUG/dalvikvm(2558): GREF has increased to 301
...
08-17 02:31:25.823: DEBUG/dalvikvm(2558): GREF has increased to 401
...
08-17 02:31:36.772: DEBUG/dalvikvm(2558): GREF has increased to 501
...
08-17 02:31:42.694: DEBUG/dalvikvm(2558): GREF has increased to 601
...
08-17 02:31:48.695: DEBUG/dalvikvm(2558): GREF has increased to 701
... 
08-17 02:31:59.883: DEBUG/dalvikvm(2558): GREF has decreased to 599
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 499
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 399
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 299
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 199

habe ich einige der Suche und sehen, dass die meisten der Bemerkungen zu diesem Thema sind ziemlich alt. Meine Sorge ist, dass ich meinen Client / Service richtig bin die Umsetzung, und wollte wissen, wie ich die Spur zu kommen, was GREF verursacht zu erhöhen. Alle Gedanken / Vorschläge sind willkommen. Dank!

Grundprogrammablauf

Client -> Creates Callback
Client -> Starts Service
Service -> Inits & Starts CountDownTimer
Service.CountDownTimer.onFinish() -> DownloadAndParse()
DownloadAndParse() -> initialize new saxRequest(), new Handler for this request.
Service.Handler->beginBroadcast()
Client.CallbackStub -> updateUI()
Client.CallbackStub -> service.startCountDownTimer()

Hoffentlich macht den Sinn. Ich würde Code hier posten, aber es gibt so viel in so viele verschiedene Dateien. Ich dachte, ich würde versuchen, und setze die oben fließen, um zu sehen, ob es etwas grell ist ... Das einzige, was ich sehen kann, ist vielleicht wieder mit dem saxRequest (), anstatt eine neue Instanz zu schaffen ... Ich werde versuchen, dass jetzt tatsächlich , aber ich würde wirklich gerne über die Auswirkungen des GREF und die Garbage Collection ..

wissen
War es hilfreich?

Lösung

Dies sind JNI globale Referenzen. Wenn Sie nicht nativen Code zu schreiben, müssen Sie nicht die direkte Kontrolle über sie. Die Log-Meldungen erscheinen, wenn CheckJNI aktiviert ist, die für das Engineering standardmäßig aktiviert ist erstellt und der Emulator.

Die Nachrichten nur bedeuten, dass native Code der VM sagt, dass es nicht einige Objekte zu verwerfen ist erlaubt. Im Wesentlichen sind global Refs eine Möglichkeit für nativen Code Verweise auf die GC Root-Satz hinzuzufügen. Unter der Annahme der nativen Code korrekt geschrieben ist, werden die globalen Refs gelöscht, wenn der native Code nicht mehr brauchen von ihnen hat.

Der einzige Grund zur Sorge wäre, wenn die globale ref Zahl weiter steigen, so dass ein globales Referenzleck vorschlagen würde. Da die VM können die Objekte nicht frei, ein globales ref Leck schließlich die VM verursachen Speicher auslaufen zu lassen. Um Hilfe solche Probleme identifizieren, eine Obergrenze für die Anzahl der globalen Referenzen gesetzt wird, wenn CheckJNI aktiviert ist (Strombegrenzung ist 2000).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top