Ich bemerkte eine merkwürdige Speichererhöhung in einer meiner Aktivitäten. Daher habe ich einen kleinen Test gemacht: Ich habe den Dialog mehrmals geöffnet (Öffnen - Schließen - Öffnen - Schließen ....) und der Speicher hat weiter zugenommen. Also habe ich die DDMS verwendet, um eine HPROF-Datei auszugeben und sie in MAT (Speicheranalysator) geöffnet. Der Leckverdächtige Bericht zeigte, dass der Hauptgrund für den wachsenden Speicherverbrauch darin bestand:
Also habe ich ein Histogramm gemacht, um diesen Dialog zu überprüfen, auf dem ich meine Tests durchgeführt habe und was ihn am Leben erhält. Es stellt sich heraus, dass es durch AutoCompleteTextViews am Leben erhalten wird, die von android.widget.TextView $ IClipboardDataPasteEventImpl am Leben erhalten werden. Allerdings gibt es keine unmittelbaren Dominatoren für IClipboardDataPasteEventImpl (außer natürlich die GC Root). Ich habe versucht, IClipboardDataPasteEventImpl im Internet zu finden, und ich habe grepcode (die Android-Quelle) gesucht, aber das Einzige, was ich mir vorstellen konnte, war: Blogeintrag . Ich kann nicht lesen, was auch immer Sprache ist, aber was ich lesen könnte sind die englischen Wörter, die darauf hindeuten, dass es ein Fehler auf dem Samsung Galaxy SII sein könnte (das Telefon, das ich benutze, Android 2.3.x laufen), bezogen auf den ClipboardManager. Allerdings bin ich mir dessen nicht sicher (ich möchte das beheben, daher bin ich abgeneigt, es einfach als einen unfixierbaren Fehler zu akzeptieren) und ich habe keine Ahnung, woher diese Zwischenablage stammt und warum. Ich wäre sehr dankbar für alle Hinweise / Ideen zu diesem Thema.
Meine Memleak-Untersuchung brachte mich auch hierher. Ich habe Probleme mit Aktivitäten, die über EditText undicht werden. android.widget.TextView $ IClipboardDataPasteEventImpl-Objekt enthält den EditText, der die Aktivität enthält. Dies geschieht auf dem Samsung Galaxy Tab 10.1 und Galaxy Tab 2 10.1, 7.0. Ich konnte es nicht auf anderen Nicht-Samsung-Geräten (Asus, Acer) reproduzieren.
Das Schlimme ist, dass ich noch keine Lösung dafür gefunden habe:)
Hier sind meine Forschungsergebnisse:
Das passiert mit jedem Activity
, dessen Inhaltsansicht aus einem EditText
besteht. finish()
ing die Activity
erhalten keine Garbage Collection, wenn sie referenziert wird, wie folgt:
Das passiert auf meinem Samsung Galaxy Tab GT-P7300 unter Android 4.0.4 , aber nicht auf meinem Samsung Galaxy Mini GT-S5570 running Android 2.2.1 .
IClipboardDataPasteEventImpl
-Objekte werden schließlich tatsächlich freigegeben, aber nur zu Zeiten, die unvorhersehbar zu sein scheinen. Da sie von java.lang.ref.FinalizerReference
referenziert werden, glaube ich, dass die IClipboardDataPasteEventImpl
Objekte darauf warten, finalize()
'd zu sein, was nur passiert, wenn die JVM das Gefühl hat. Weitere Informationen finden Sie in den SO-Fragen:
Entschuldigung, keine Lösung, aber hier ist meine beste Problemumgehung:
In onDestroy()
Ihrer Activity
, geben Sie möglichst viele Verweise auf andere Objekte frei (besonders die großen wie Bitmaps, Sammlungen und untergeordnete Ansichten Ihrer Aktivität) das:
Auf diese Weise können wir zumindest die Verluste reduzieren und hoffentlich nicht aus dem Gedächtnis gehen, bevor die JVM die Stimmung hat, all diese bösen IClipboardDataPasteEventImpl
-Objekte zu finalisieren und zu sammeln.
In einer idealen Welt der Müllsammlung wäre dies unnötig, aber ich denke, wir sollten alle erkennen, dass unsere Welt nicht perfekt ist und wir nur mit den Fehlern leben müssen.
Unten ist meine Übersetzung des ursprünglichen Blogeintrags (auf Chinesisch) wie in der Frage erwähnt. Hoffentlich kann dies jedem ein besseres Verständnis für das Thema geben.
Galaxy S2 Speicherleck mit TextView
不 知道 是 不是 哪邊 弄錯
Nicht sicher, wo es schief gegangen ist
但是 Galaxie s2 text Textansicht 會 產生 Speicherleck
Aber das textview
von galaxy s2 verursacht Speicherlecks
leak 是 發生 在 android.widget.TextView $ IClipboardDataPasteEventImpl 這個 Schnittstelle 上
Leck passiert in interface
android.widget.TextView$IClipboardDataPasteEventImpl
它 會 抓住 mContext 造成 整個 Aktivität 沒 辦法 被 gc
Er enthält die mContext
und stoppt die activity
davon, gc 'ed
(2.3.4) 跟 se xperia arc (2.3.4) 和 acer liquid (2.1) 都 沒有 問題
Kein Problem mit der gleichen App auf htc sensation (2.3.4) , se xperia arc (2.3.4) und acer liquid (2.1)
而且 網路 上 完全 找不到 android.widget.TextAnsicht $ IClipboardDataPasteEventImpl 相關 的 資料
Und ich kann überhaupt nichts im Zusammenhang mit android.widget.TextView$IClipboardDataPasteEventImpl
im Web finden
Android-Quellcode 是 也 找不到 看起來 應該 是 Samsung 自己 加 的 東西 ...
Nicht einmal im Android-Quellcode , also scheint es etwas zu sein, das von samsung selbst hinzugefügt wurde ...
之前 open opengl viewport bug 已經 夠 頭痛 了 接下來 soundpool 相關 Fehler 也 搞 累 很多 人
Der opengl-Viewport-Bug hatte schon Kopfschmerzen, und der soundpool -Bug -Bug hatte viele frustriert
現在 這個 Speicherleck 又 來攪局 ...
Und nun, hier kommt ein Speicherleck herumspielen ...
看來 手機 外型 還是 比較 重要 / _ \ ... 外型 好 先 吸到 人 買 買 Fehler 再 慢慢 修 就好
Es scheint, dass das Aussehen von Mobiltelefonen wichtiger ist / _ \ ... gutes Aussehen zieht Kunden an; Bugs könnten später behoben werden
[後記]
[P.S.]
經過 一些 試驗 發現 只要 按 HOME-Taste 回到 桌面, 那些 leak 就會 被 釋放 掉 ...
Nach einigen Tests habe ich herausgefunden, dass die Lecks durch Drücken der HOME-Taste freigegeben werden, um zum Desktop zurückzukehren ...
logcat 會 顯示 一行 Dialogfeld "Zwischenablage ausblenden" bei Starteingabe: von jemand anderem beendet ...!
Es zeigt Zwischenablage-Dialog ausblenden unter Start-Eingabe: beendet von jemand anderem ...! in logcat
看起來 Galaxie s2 裡面 有 偷偷 對 Zwischenablage 作 一些 操作 ...
Es scheint, dass galaxy s2 auf der Zwischenablage unter der Haube funktioniert ...
但 如果 一直 保持 在 App 裡面 運作 話 那些, 那些 leak 還是 會 存在 ... 最後 應該 會 發生 OOM-Ausnahme
Aber wenn wir in der App bleiben bleiben diese Lecks ... schließlich würde eine OOM-Ausnahme auftreten
現在 只能 期望 Galaxie s2 的 ics 版 會 修 掉 這個 怪 問題 了 ...
Jetzt können wir nur hoffen, dass dieses seltsame Problem in der ics Version von galaxy s2 gelöst wird ...
Tags und Links memory-leaks android android-ui