Press "Enter" to skip to content

GOTO 2016 • LeakCanary, then what? Nuking Nasty Memory Leaks • Pierre-Yves Ricau


va bene ciao a tutti, sono così io
lavorare in quadrato sul team API e uno
dei miei progetti pet è chiamato il canarino
così oggi stiamo andando parlare su che in
il migliore che ho parlato di come
canarino è costruito oggi non lo faremo
facciamo che in realtà inizieremo
esaminando ciò che possiamo fare con tutti
questa informazione che è il canarino
fare e come possiamo effettivamente risolvere la memoria
perdite ma prima come con ogni discorso qui
Ti incoraggio a impegnarti e a chiedere
mette in discussione qualsiasi domanda anche complicata
felice di prendere quelli così iniziamo con
una sorta di storia per tipo di impostare la cornice
quindi diciamo che abbiamo una finzione
ingegnere e chiamiamolo Steve è un
un po ‘ di artista e lui vuole fare un
dichiarazione su come loro app mobili
tipo di presa che rubano l’attenzione lontano
nella nostra vita sai sempre come
cliccando il nostro telefono così ho deciso di fare
un’app e avere l’utente ancora il
concentrarsi dal tipo di app di un Ven voi
conosci il tipo di vendetta di avvicinarsi così
l’app prende vita quando è focalizzata
e poi quel tipo di morire quando
non è così e ho deciso di farlo
usa multi-window è così e così mi piace
è un’app che ha preso l’app è solo
la parte superiore della parte inferiore è Evernote
ed è solo blu e poi quando
ti focalizzi all’esterno diventa grigio e poi
diventa blu è come il più
app stupefacente mai così che lo libera e
nel Play Store e ovviamente lui ottiene
un sacco di download giusto e così
molti download di milioni di dollari grandi
successo e poi inizia a prendere
recensioni a una stella a causa di arresti anomali
la gente si lamenta degli incidenti, quindi aggiunge
un reporter di crash nella linfa degli alberi e controlli
fuori quello che sta succedendo e si scopre
che ottiene un mazzo di fuori della memoria
errori Wow
quindi ora devi ricordare cosa fai
qual è la soluzione a quel bene loro
tipo di avvio spuntando in diversi
luoghi così ha capito è solo per quello
la marcatura è in difficoltà e lo sai che è
dimenticare e andare avanti con la nostra
la vita e forse non succederà
ancora
il problema è che continua ad accadere e
ancora e ancora e ancora con
diverse tracce dello stack, quindi ascolta
A proposito di una libreria chiamata il canarino e
Non hanno ya e come si suppone di fare
tutto facile e per aiutarti a risolvere
quelle cose che avevi, sai
dipendenze per utilizzare la libreria e quindi
aggiorna la sua classe di applicazione in modo che tu
sai solo che sono due righe di codice
è installato e quindi lo usa
di nuovo e ora le cose stanno iniziando a
capita , sai come usi l’app tu
prova a mettere a fuoco credo che ho bisogno di iniziare il
video e, sì, aspetteremo un
un po ‘ sai che ci vuole un po’
un po ‘ come cinque secondi probabilmente e
quindi non essere memoria l’app lo farà
congelare bro probabilmente hai visto che se
hai usato il liquore in passato, quindi cosa c’è
andando sul canarino sta agendo ora il
la prossima cosa che ottieni è una notifica e
quando lo tocchi sulla notifica
farti sapere questa cosa di Freddy
potrebbe essere un po ‘spaventoso come cosa
significa ciò che stiamo guardando qui
quindi fingiamo di essere Steve e lo sono
guardando questo e come se non ne avessi idea
cosa sta succedendo ma vedo questo punto qui
sembra che questo sia il mio codice, okay
andando basta guardare in che questo
visione del neo-realismo che tu sai che è
in realtà la vista che rende blu è
la visione più importante in the
app e il modo in cui si focalizza
e fuori è solo registrando un
callback del ciclo di vita delle attività e
cambiando l’ alfa della vista in base a
le attività di bellezza riprese o pubblicano
ora se sei un po ‘esperto di Android
probabilmente hai notato che siamo
registrando un ciclo di vita dell’attività
callback e cosa significa che siamo
ottenere la classe dell’applicazione che è
singleton e stiamo aggiungendo un ascoltatore a
così ogni volta che un’attività è
ripreso e pausa sapete che impariamo
su di esso si ottiene siamo chiamata andando indietro
il problema è che non si annulla mai la registrazione
quella richiamata così è la nostra istanza di visualizzazione
perdendo bene quindi qual è la correzione risolverà
sembra ovvio
sai quando le viste si staccano solo
rimuovere la richiamata dal
applicazione quindi abbiamo risolto il problema ma
abbiamo davvero risolto il problema?
facciamo qui penso a cosa abbiamo fatto qui cosa
Steve ha fatto e quello che facciamo tutti
quando si tratta di questo è gentile
di cercare di indovinare cosa sta succedendo e noi
guarda un sacco di classi che sembrano
familiare e saltiamo in loro e noi
guardali e come oh penso ci sia
una perdita qui quindi questa è la perdita e noi
riparato la perdita giusta e qualche volta quella
funziona ma quando non funziona sei di
te stesso e tu sei come non lo so
cosa fare questo è probabilmente solo un
Android perdite e poi si dimentica di
e andare avanti con la tua vita così
l’intuizione aiuta ma ed ecco cosa
stiamo usando qui il problema è
l’intuizione è che ti fa prendere un
scorciatoia è il punto centrale
ma tu vuoi che tu non voglia prendere
scorciatoie logiche e hai bisogno di gentilezza
di passo indietro tornare al primo
i principi applicano una sorta di scientifico
metodo perché sai che siamo ingegneri
è un po ‘quello che facciamo
quindi torniamo a scuola e parliamo
di classe, quindi abbiamo una lezione
classe A e poi abbiamo classe B Wow e
c’è la classe C e noi siamo
creerò un’istanza di Classe A tutto
è abbastanza facile, quindi cosa succede
quando chiamo questo metodo triumvirato come
alla fine di esso
bene se chiamo questo metodo alla fine di
A è spazzatura raccolta perché
ovviamente non c’è nulla che mantenga un
riferimento a un così è inutile ed è
sta per essere raccolta media oh è un
obiettivo di garbage collector e lo sarà
spazzatura raccolti in futuro ora
torniamo a dire che siamo noi
crea anche un’istanza B e una
esempio C tutto bene non molto
interessante finora ma poi aggiungiamo una B
campo su un e sai vedono campo in B
e un campo su C e ancora niente
ancora lo stesso, ma ora lo faremo
inizia a impostare i riferimenti quindi andremo
cambia il codice in modo che un punto B
riferimenti B stessa cosa per C stessa cosa
per un così abbiamo questi tre oggetti in
il riferimento l’uno all’altro
ora cosa succede alla fine di questo
metodo
bene ancora tre oggetti sono spazzatura
raccolto giusto
hanno tutti riferimenti in entrata a
loro e tutti fanno riferimento a tutti
cose ma sono solo collegati
insieme così quando niente è tutto sommato
ritenendo che nient’altro sta mantenendo
li hanno appena raccolto dei rifiuti
bene, è bello ora aggiungiamo una statica
campo giusto faremo una statica
figlio single del campo e lo faremo
riferimento uno stiamo andando passivazione l’una
riferimento alla singola ora ora che cosa è
andando avanti se provo a se quando guido il
metodo
niente viene raccolto dalla spazzatura perché
l’ intero gruppo di oggetti è tenuto dentro
memoria quindi qui statico un singleton
si chiama una radice GC è quello che ho
mostrato come la scatola gialla è qualcosa
questo non sarà mai raccolto dalla spazzatura
è un riferimento che non viene mai cancellato
quindi potresti pensare a dei campi statici
può anche pensare a variabili locali su
discussioni o riferimenti sono tenuti da nativi
codice come binder ad esempio così è
interessante ma amiamo zoomare e
pensa alla memoria di Java se pensi
su di esso tutta la memoria è carina
un sacco di radici di GC che hanno
riferimenti a oggetti che hanno
riferimenti ad altri oggetti è a
grafico diretto puoi pensare a Java
memoria come grafico diretto e quindi possiamo
applica qualche teoria dei grafi come alcuni
cose minuscole quindi possiamo guardare il
il blocco di oggetti qui sono
non collegato a nulla di loro gentile
di conto proprio ci sono isole così
possono essere raccolti in modo corretto e
se ne sono andati, quindi un oggetto può essere spazzatura
raccolto è se non è collegato in
in qualche modo a una radice di GC e questo è molto
importante perché questo è ciò che crea
perdite di memoria quindi diciamo che facciamo il
la cosa rossa qui è un’attività e via
destroy è stato chiamato da Android su
quell’attività così sappiamo che è così
inutile a quel punto e che niente
ha davvero bisogno di usarlo e basta
non dovrebbe essere in uso ma è ancora te
sapere aggrapparsi a molta memoria e
vogliamo che sia raccolta dei rifiuti
e così questa attività è tenuta in memoria
perché c’è un percorso c’è un mucchio
di riferimenti che alla fine fanno riferimento
l’attività ed è per questo che è tenuto dentro
memoria giusta in modo che l’attività stia perdendo
quindi se volessimo capire perché è
perdendo dobbiamo trovare un percorso da
quelle scatole gialle per l’attività è
chiamato un percorso per le radici GC va bene così
questo è quello che sembra
esempio c’è nella memoria Java
di solito finisci con un infinito di
veloce perché ci sono così tanti oggetti
che sono collegati insieme in modo che tu possa
guarda come 10.000 percorsi che non è
molto utile
quello che è più utile è se c’è il permesso
diciamo che c’è una sola perdita una cattiva
riferimento che sta causando l’attività
perdita quindi c’è un’affinità di percorso
ma ce n’è uno che è il più breve
percorso che è garantito per passare
quella cattiva referenza così invece di guardare
a 10.000 percorsi possiamo solo guardare uno
e stiamo andando a guardare il più breve
perché sono meno informazioni da trattare
con così questo è il percorso più breve in
quel caso e poi questo è ciò che effettivamente
ciò che lisary ci offre è il display
che abbiamo visto questo è esattamente quello che è
mostrando in una sorta di modo testuale ora
questo è interessante ma è qui
come l’intero trucco inizia ad applicare ok
abbiamo questo percorso cosa facciamo ora
quello che facciamo è identificare gli oggetti
il percorso dovrebbe essere ancora
in loro nella memoria e gli oggetti sono
dovrebbe essere andato e non è solo
per esempio, forse uno
il primo verde è la classe di applicazione
dovrebbe rimanere in giro per sempre perché
è un singleton forse il primo rosso
è una classe fu e la seconda è rossa
l’ attività e la vista è distaccata
dovrebbe essere andato così se siamo in grado di gentilezza
di identificare quelli che dovrebbero essere dentro
memoria e quelli che non dovrebbero essere
in memoria allora possiamo sorta di spaccature sono
i percorsi in una sorta di due aree e noi
in grado di identificare la connessione che è
creando il problema va bene così
quello che succederà è per ogni
perdita singola la parte superiore è sempre in corso
essere oggetti che dovrebbero essere in memoria
e la parte inferiore andrà sempre a
essere oggetti che non dovrebbero essere in memoria
e la parte chiave per te è identificare
ciascuna delle due zone non lo farà
interleave quindi la parte superiore è sempre verde
il fondo è sempre rosso e il
luogo dove cambia è dove c’è
un cattivo riferimento che devi uccidere
e se si uccide così male riferimento poi
l’oggetto non è connesso a GC con
più e l’intera cosa può essere
la spazzatura raccolta va bene così è stato
un po ‘di teoria e ora siamo
andando a guardare un paio di esempi
l’idea è che penso sia bello nel
astratto abbiamo bisogno di tipo di pratica per
ottenere l’idea di come risolvere queste cose
quindi diamo un’occhiata al primo esempio
abbiamo avuto questo dizionario come questo
app molto semplice quindi la prima cosa è
inizi a guardarlo e potresti farlo
non avere familiarità con questo ragazzo qui
c’è come un dollaro se lo sono se lo sono
Steve ho appena iniziato a scrivere Android
app e io sono tipo oh che cos’è questa classe
questo è il nome dollaro uno e poi c’è
un campo chiamato dostala ‘zero ciò che è
questo quindi cerchiamo di ottenere su che così abbiamo visto
quel codice e abbiamo visto che c’è una vita
il callback del ciclo è in realtà un anonimo
classe giusta e questo è quello che è
quindi in Java questo potrebbe essere utile per a
molti di voi, ma Java non in realtà
supportare le classi anonime è una bugia
è tutta una bugia che scrivi anonimo
classe e poi cosa compila
a una vera classe e ti nomina a
dollaro un certo numero e il numero è
in base a dove è definito così il primo
uno in negozio una seconda uno è
dollaro due in quella classe e poi il
nome del campo sta per essere come
questo dollaro zero quindi se torni
qui e quando guardiamo questa traccia del tick
ora abbiamo una migliore comprensione di
quello che sta succedendo lo possiamo vedere al
in alto c’è una classe chiamata attività
thread ha un campo chiamato chiamato come
thread di attività corrente e quel campo
punta a un’istanza di thread di attività
che ha un campo chiamato M iniziale
applicazione che indica se stesso a
istanza dell’applicazione che ha a
dei callback del ciclo di vita Exeter Exeter
Exeter ha paura di come li leggi
le cose vanno bene così come ho detto che possiamo sputare
la traccia di perdita in due aree è buona
roba e le cose cattive e una volta che siamo
in grado di farlo sappiamo che il posto
dove le cose devono essere riparate è dove
c’è differenza tra i due così
qui che sarebbe il caso si guarda
che puoi vedere che la vista dovrebbe essere
non dovrebbe essere in memoria il ciclo di vita
i callback non dovrebbero essere in memoria ma
l’elenco dei callback del ciclo di vita dovrebbe
probabilmente sarà in memoria quindi cominciamo
da zero e tipo di fare passo dopo
passo se sto guardando qualcosa che fresco
sapere che la mia attività perde perché
è quello che ha riferito il canarino
l’ attività è distrutta, lo so anche io
che la classe dell’applicazione è un singolo
termine ed è sempre lì quindi non lo è
non perde mai, quindi se posso dire il
la classe di applicazione è buona e quindi
tutto sopra è buono anche io
non hanno nemmeno bisogno di preoccuparsi di esso e
poi c’è una vista qui e noi tipo di
sapere che la vista dovrebbe essere sparita
già ma vediamo come funziona
abbiamo capirlo e così il canarino ha
una cosa chiamata informazione di condivisione ed è
fondamentalmente condividerò un po ‘ di testo
che ti dà più dettagli è un po ‘di
una rappresentazione testuale di questo
sembra così e puoi vedere
lo stesso come riferimenti Valvo dal
stessa vista ma in fondo c’è a
sezione di dettaglio e la sezione di dettaglio in
i topi sembrano pazzi
solo un sacco di roba ma è tutto il
valori dei campi statici e il
campi negli oggetti sulla catena e
quindi se scorri verso il basso attraverso la vista
che abbiamo qui e iniziamo guardando
campi possiamo vedere che c’è un campo
chiamato M allegata informazioni che non è così
ciò che è M attaccato per bene se noi
apri la classe di visualizzazione possiamo vedere che il
il metodo chiamato è allegato alla finestra
in realtà controlla le informazioni M allegate così
essere nullo quindi quando l’allegato M per
è no la vista non è allegata al
finestra e se gli utenti non sono collegati a
la finestra quindi non ha davvero un
il business che sta intorno dovrebbe probabilmente
essere spazzatura raccolti perché chi ha bisogno di un
vista che non è attaccato alla finestra
giusto questo è un po ‘il nostro suggerimento che questo
vista dovrebbe essere raccolta dei rifiuti così noi
che possiamo gradire salire e includere il
guarda e poi la richiamata è gentile
di legato alla vista dovrebbe anche essere sparito
quindi siamo praticamente tornati a dove siamo noi
erano Ho aggiunto l’ultimo della lista in fondo
ti piacciono le callback del ciclo di vita delle attività
è un ArrayList e quindi puoi vedere
che va giù e il tuo rilascio è
implementato da un array e poi il
primo limite dei tuoi waypoint verso
le callback vanno bene così va bene
ho visto i primi principi che ottengono
entriamo in leghe più interessanti
così quando lo si installa e canarino e
come se lo passassi , sai che lo fai
un’applicazione e hai tutti dentro
la tua azienda usa l’applicazione dev
con il canarino su cosa succede quando
quando il canarino è attivato e
la notifica si presenta così ti potresti pensare
sapere che le persone si siederanno a portarlo
lo aggiusti bene, sai cosa effettivamente
succede è che fai scorrere il
la notifica via e basta fare
qualcos’altro e tu fingi come te
non ho visto che c’era un aspetto di perdita
è un po ‘fastidioso e tu non vuoi
mi piace cambiare quello che stai facendo così noi
avuto questo problema abbiamo pensato a un modo per
sistemalo per automatizzare la perdita
segnalando in modo che vengano caricati
sullo sfondo è stato fantastico
idea ma nessuno vuole scrivere a
back-end per questo non l’ho fatto di certo
quello che abbiamo fatto è che abbiamo deciso di caricare su un
crash reporter e per simulare un crash così noi
fondamentalmente puoi fingere un incidente con
facendo un falso stack traccia questo è come
fai una finta eccezione e poi tu
può quindi passare a una traccia di stack falso su a
falso o un reporter di crash e poi noi
sai che riusciamo a intrappolarci e noi
ha avuto un uploader di perdita di bug bug che
convertito la traccia di perdita in un falso
pila traccia e quindi è così nuvoloso a
nero intoppo che poi ci dà questo questo
sembra una traccia di stack ma non lo è
ma puoi vedere perché come c’è a
oggetto in viaggio e poi il metodo
il nome è uguale a zero, che è strano o 97
ma c’è un’altra scheda in cui noi
in realtà ha aggiunto il tipo di significativo
informazioni quindi la parte bella qui è
che se ottieni cinque volte la stessa perdita
andando a portare alla stessa traccia di stack
e poi torna indietro scorie o crashlytics
andando a raggruppare insieme in modo da ottenere
raggruppando e contando e conosci il
perdite che si verificano più spesso così
è davvero bello ma poi c’è
un’altra volta dammi un secondo
oh scusa c’è un’altra scheda che
fornisce come lo stesso utile
informazione
quindi diamo un’occhiata a quello che è quello
su e tu sai se fai un rapido
scansione si potrebbe dire oh, c’è il supporto
biblioteca lì dentro non voglio saperlo
a tale proposito andiamo via ma no
non vogliamo perdite, quindi stiamo andando
guardare in ogni perdita così comincio con il
in alto possiamo vedere che c’è un looper in
la cima ed è sotto il campo che è
aggrapparsi ad esso è chiamato main main
looper quindi sei abbastanza sicuro che questo
è il looper del thread principale e il
il thread principale è per sempre il looper
del thread principale è eseguito per sempre così tu
sappi che va bene
un altro in fondo possiamo vederlo
c’è l’attività che perde, va bene
questo è ciò che dovrebbe essere morto allora
stiamo andando a curiosare tra di noi
guarda quello di mezzo c’è una classe
chiamato rank tu e ha un campo
chiamato M azioni e com’è questo
chi ha mai guardato il codice della corsa
fare la fila davanti alla stanza
nessuno nessuno che è buono ma è Android
open source quindi lo faremo bene
adesso
giusto così abbiamo le informazioni sul percorso di visualizzazione
che è in realtà la visione che è quella
alla radice della tua vista è la gerarchia
non esposto da Android SDK ma
è così che è nel codice e nella classifica U
è una classe interna di questo ed esegue la coda
ha un metodo chiamato post posticipato che
fondamentalmente ti lascia passare una riga normale
e lo avvolgerà in un gestore
azione e poi aggiungerà questo
azione per azioni M che è una lista di
azioni giuste è facile e poi
c’è un altro metodo che viene chiamato
postare e basta postulare con a
ritardo di 0 giusto così lontano così bene così
quello che sembra è che quando chiami
post sei effettivamente in coda a
eseguibile in azioni M e quando è D
in coda
leggiamo Javadoc Javadoc dice il
il lavoro viene eseguito durante la prossima chiamata a
eseguire anime di viaggio sul filo così
questa è la via di visualizzazione, questa è l’unica
che gestisce l’attraversamento che sono
andando a misurare i tuoi layout ed è
fondamentalmente dicendo che sto mantenendo le cose qui
fino a quando non avrò la successiva traversata e poi
chi sta chiamando che dire se la coda di esecuzione
è utilizzato per il lavoro di pennino NQ da punti di vista
quando nessun conduttore è attaccato, quindi solo questo
succede quando sei tra due
attraversamenti e non c’è vista
gerarchia in giro per eseguire il lavoro così
verifichiamo che se guardi il
guarda la lezione e apriamo la persona e mettiamo
qualche animazione in post possiamo vederlo
la prima cosa che fa è ottenere il
flusso d’ imitazione che possiamo così sapere
se è il nodo delle viste in allegato e tu
sapere se non si conosce la prima quattro ruote
nel coreografo o nel conduttore
ma se non si ottiene la coda di esecuzione e
postare tutto bene così sembra
conferma ciò che Javadoc stava dicendo così
l’idea è a quel punto che non abbiamo
una vista non abbiamo una gerarchia il
la vista è staccata dall’inizio allegata a a
finestra ma stiamo postando in quella coda
e la prossima volta avremo una nuova visione
gerarchia abbiamo intenzione di eseguire quelli
le cose e dove ti trovi bene
è il metodo statico dove è l’ affitto
tu vieni da così viene da questo
ottenere eseguire metodo di spunto e che cosa è la sua
memorizzato in un thread locale così tu te
sai un thread locale è che è un
variabile per cui ogni thread ha il suo
valore proprio ma per lo scopo di questo
puoi solo pensarlo come una statica
filo che sta indicando l’affitto di te
accetta ogni thread come spiacente come statico
campo che punta a classificare te e
quindi ogni thread ottiene il suo modo quindi
se osserviamo il metodo di classificazione, allora lo è
fondamentalmente se l’accusatore non sa quale
in coda altrimenti creare un negozio
e torna tutto bene è carino
facile così che ci porta a due che dove
possiamo vedere che possiamo iniziare a capire
le cose che stanno sotto hanno ragione
qui che tira fuori i valori locali è
non la corsa che senti che stavamo dicendo
ma questo è fondamentalmente come i locali dei thread
sono memorizzati su onesto proprio su Android così
il grado che sai è statico
campo
non sembra che ci sia qualcosa
sbagliato lì così si limita a tenere una lista
di azione quindi il grado di te e la sua lista
di azioni dovrebbero in realtà aderire
memoria quindi se vai giù laggiu ‘
c’è come classificare le azioni
elencare se stesso non gli elementi nella lista
ma la lista completa dovrebbe essere in
memoria quindi è un po ‘come ora
queste cose in là in modo diamo un’occhiata a
questo strano nome di classe che ho paragonato a
il cancello del palo 323 che cos’è quello?
è un esempio di delegato di app compat
quindi risulta che se usi il
super biblioteca su Android devi
estendere l’ attività compat app e quale app
l’attività compat è anche delegata IP
e delega tutte le chiamate a
quel delegato e poi lo hai
diverse implementazioni del
delegato basato sulla versione di Android
e così perché crea un’istanza
proprio lì quando l’attività è
distrutto dovrebbe essere il delegato
distrutto pure, ce n’è uno
istanza per attività in modo che possiamo venire
di nuovo qui e ora sappiamo che delegato
dovrebbe essere andato tutto bene, questo è il
ragionamento che continui ad applicare quando
guardi un po ‘la traccia quindi andiamo
guarda quello sopra così V nove dollari
uno quindi è una classe anonima quindi io
ha parlato di come ci sia stato un sacco di
implementazione e V 23 si estende in realtà
v 9 alla fine quindi apriamo la v 9
classe e dollaro una classe è questa
eseguibile, invalido la manovra del pannello
normale e poi viene pubblicato su un wii
su una vista con animazione speciale a destra
e così se quella visione non fosse allegata, noi
sai già cosa succede pubblichi il nostro
Animazione Il parere non attaccato si arriva
messo in coda di esecuzione e sarà d
accodato ed eseguito la prossima volta
la prossima volta che c’è una vista
gerarchia, ma cosa succede se l’attività è
distrutto e l’utente va via e
non c’è un’attività per altri 30
minuti poi la palla runner è ancora dentro
la fila per altri 30 minuti e
lascia l’intera gerarchia della vista e così via
in pratica stai mantenendo l’intera vista
Turchia e tutti i suoi bitmap per un altro
30 minuti finché non ne ottieni un altro
attività quindi è una perdita e quindi il modo
potresti aggiustarlo che non lo so
questa è la strada giusta ma a senso unico
potrebbe essere
bene quando i delegati sanno che il
l’attività è distrutta basta rimuovere il
richiamare dalla coda di esecuzione
in pratica quindi questo è stato un un interessante
interessante tipo di perdita, in realtà
ha presentato un problema questo è o questo è reale
perdita che abbiamo trovato la scorsa settimana, quindi
non ho visto alcuna risposta dal
supporto squadra di biblioteca, ma lo sono
esaminandolo così come abbiamo bisogno di dare
loro tempo alla fine sarà
corretto non è come uno dei più grandi
perdite ma ti incoraggio per il motivo che sono
dimostrarlo è perché lo voglio
incoraggiarti a fare lo stesso la prossima volta
trovi una perdita Android è open source
puoi andare e anche se non è nel tuo
codice che dal modo in cui è ancora un po ‘
probabilmente nella tua auto come la maggior parte di
il tempo è nel nostro codice non nel
supporto biblioteca ma se non è nel tuo
codice non lasciarlo cadere sul pavimento
guarda dentro cerca nel codice prova a
capire cosa sta succedendo e poi
segnalare un bug sulla questione inseguitore iOS P
perché se lo facciamo tutti allora facciamo un
il film rende Android migliore e poi
ognuno trae profitto da tutto giusto così
diamo un’occhiata a quello che forse è un po ‘
‘più difficile è stato più difficile per me che ero
veramente confuso da questo in origine così questo
è il link al nuovo riso trapelato oggi io
controllato per assicurarsi che non lo ero
come mostrare qualsiasi brutto nome o altro
informazioni sensibili che non dovrebbero essere
lì dentro ma penso sia buono ma questo
è un vero e proprio codice quadrato, quindi facciamolo così
facciamo lo stesso, così ho detto di no
usare l’ intuizione o meglio non usare
intuizione per rendere logica la scorciatoia
scorciatoie ma l’intuizione aiuta qui
sapere di trovare una cosa buona da guardare
a destra come ce ne sono molti
riferimenti o molti oggetti qui e
Io non voglio guardare ogni cosa
uno di loro perché se riesco a trovarne uno dentro
al centro e so che è buono o io
so che è brutto che
Posso portare giù la parte verde o portare
la parte rossa va bene così stiamo andando
essere gentile di questo e io posso
vedi che proprio nel mezzo c’è a
classe chiamata passaporto e
bloccare questa vista è una visione e io tipo di
sapere come verifichiamo se dovresti
essere in giro o non proprio abbiamo già visto
quindi diamo un’occhiata a quella vista
e controlla se dovrebbe essere spazzatura
raccolti così come siamo andati al
dettagli e possiamo vedere quell’imitazione 4
è noto quindi la vista è staccata
possiamo supporre che dovrebbe essere sparito
quel punto che è davvero bello perché
ora possiamo solo rendere tutto ciò che è rosso
bene sai che non dobbiamo guardare
di seguito la perdita deve essere da qualche parte
sopra quella colpa
allora andiamo avanti un altro
classe anonima , quindi indovina cosa nomino
le classi tendono ad essere molto spesso
presenta quando hai una perdita a causa di
il naturale sai che hanno sempre un
riferimento esterno alla classe in cui essi
sono dichiarati in modo tale che tende a creare
foglia non è sempre il caso in modo da non fare
salta alle conclusioni ora qui è gentile
di uno interessante si chiama dollaro
un dollaro per dollaro uno così puoi
avere come un qualsiasi numero di dollari è
perché è una classe anonima in
classe anonima, quindi possiamo farlo
quindi abbiamo questo cestino e vista a colpi
quello che fa è che abbiamo una piccola utility
metodo chiamato peso per misura o tu
passare una vista e una richiamata e chiama
ritorno quando la vista è stata misurata
e così è per prima cosa che non conosco la mancanza
classe che stiamo dicendo vedendo ma il
il secondo è dove sono le cose
interessante quello che stiamo facendo è che siamo
ottenendo un oggetto creatore di richiesta che
è un oggetto Picasso Picasso è gentile
di libreria di immagini open source per realizzarlo
molto facile da gestire con le immagini su Android
e quindi qui questo è qualcosa che
fondamentalmente fa una richiesta dopo la visualizzazione
è stato misurato e hai ricevuto una chiamata
indietro quando ha successo o errore quindi
sai, diamo un’occhiata al Javadoc di
questa richiesta nel metodo perché
perché i ragazzi sono intelligenti e
che ti stanno dicendo cosa si dovrebbe fare
e cosa non dovresti fare quando tu
è la chiamata in Java Docs
sciocco asincrono
sente la richiesta nel specificato
immagine e richiama il bersaglio
callback sapere fino ad ora così buono ma
c’è anche una nota che è la
il programma di callback è un riferimento forte
e impedirà la tua attività di
frammenti da essere raccolti mediamente
haha
quindi ero come si, è così
e dice anche se lo sai usare
questo metodo è fortemente raccomandato
tu invochi un adiacente a causa di
la richiesta di annullamento della richiesta per prevenire
perdite temporanee quindi suona ovviamente
come se ci fossimo dimenticati di farlo, così ho aperto
il codice di accesso e un altro indovinate un po ‘
in realtà stavamo già chiamando Cancel
chiedo come sono stato a quel punto
Va bene non so cosa sta succedendo ero
tipo di perso ho deciso di dare un’occhiata a
Picasso cosa effettivamente cancella la richiesta
fa e così apri insieme come
questo è il metodo di richiesta di annullamento e
essenzialmente quello che ha ma lo fa a
mucchio di cose, ma ha un minimo di a
mappa di destinazione per azioni in esso sai
prende le tue immagini che sono target
rimuove dalla mappa ti dà il
azione indietro e poi va cancellato
l’azione giusta e quindi cosa succede
quando chiami annulla sull’azione a
un sacco di cose ma nella superclasse
c’è un booleano chiamato cancellato e così via
diventa vero e la ragione per cui vado
c’è e cosa faccio quando prendo
il codice è che cerco di stato perché ho
sappi che posso andare a vedere se è così
stato partite nei dettagli che ho
circa la perdita va bene così se vengo
torna all’azione della vista dell’immagine che è
un’azione quindi posso guardare gli stati
Oh, cancella questi difetti, aspetta che chiami il
richiesta annullare ma Ken è tutto falso
non può accadere perché le richieste si annullano
imposta cancel to true questo è molto
confondendo così sembra davvero il
la perdita è sicuramente lì ma non abbiamo
idea di quello che sta succedendo quindi è molto
ci mostra che la perdita è fondamentalmente
possiamo facilmente ragionare ora sappiamo
dovrebbe essere l’azione immaginaria di Emmy
andato è legato alla vista dell’immagine il
passato e passato : la revisione dovrebbe essere sparita
sappiamo che la lista delle azioni
loro stessi probabilmente dovrebbero essere ancora
in giro quindi sappiamo che la perdita è lì
ma non sappiamo perché sta accadendo e
è lì che le cose possono andare
ottenere un po ‘ fastidioso come quello che fai
ora abbiamo trovato la perdita ma non lo sappiamo
come l’abbiamo creato bene ne abbiamo fatto un altro
hackerare e se potessi curiosare nel
memoria e mi piace capire più cose
bene si scopre che è una discarica di heap
è per il quale è ciò che leakin il nostro utilizza il
Tipo di Canary prende una scorciatoia e
ti visita la vista veloce ma puoi farlo
è il vecchio modo che sta spaccando in giro
in memoria, così sai che abbiamo pensato bene a noi
tipo di bisogno di quei salti anca quando il
le perdite si verificano, quindi è necessario caricarle
ma di nuovo sono troppo pigro per costruire un
back-end right Non voglio farlo
quindi cosa fai invece bene si gira
fuori che il gioco ha una API molto bella per
caricare cose o chat o altro
e puoi caricare un dump dell’heap proprio come
così e questo è vero, abbiamo un po ‘di flessibilità
canale che ottiene solo un po ‘ di perdite
segnalato e puoi vederlo
in realtà ha un binario finora così buono
è come se non si fosse davvero raggiunto
noi dicendoci di non farlo sono
aspettandomi che un giorno lo diventeranno
davvero infelice ma forse se tutti
inizia a farlo lo vedremo comunque lo è
molto bello è molto pratico perché
poi in pratica vado indietro, intoppo
basta andare lì trovo quella perdita e se io
ho bisogno di più informazioni vado e mi rilasso così
la cosa con il gioco è che è difficile
mi piace avere quella griglia che io
non ho spalle ora ma quando cerco
qualcosa di specifico in cui cerco solo
perdere tempo e poi scaricare il file binario e
allora ce l’ho così ho scaricato
li ho scaricati dal loro allentamento allora
quindi sappiamo che la prima cosa che facciamo
in questa classe di Picasso quando puoi ordinare
annullare una richiesta è rimuovere i bersagli
dalla mappa diritto alla mappa non dovrebbe
avere questa voce più quindi diamo un’occhiata
la mappa cerca questo oggetto azione così
Apro la discarica dell’anca con qualcosa
hai chiamato i tuoi figli che ti credo
bisogno di una licenza per quello che potrebbe esserci
alcune licenze gratuite l’altra opzione è
utilizzare Eclipse strumento analizzatore di memoria Matt
Mi piace tuo figlio, immagino due ragioni
uno funziona con termini hip di Android e
per la partita di eclissi
devi prima convertirli e poi tu
può caricarli ma l’altra ragione è
che è più bello che si sente
meglio
Non so che Eclipse si sente solo male e
sbagliato così c’è come qualcosa su
quello che mi spegne comunque così io
iniziato sai facile cercare
Picasso e qualcosa di interessante
in alto c’è due casi
okay, guarderò i due e così io
guarda il primo e vedo che il
la mappa obiettivo per azione ha zero voci
va bene
e il secondo l’obiettivo di azione
che ha una voce e una di quelle
la voce è l’ azione imageview quella
che stavo cercando e così
e puoi vedere che il riferimento è
come se fosse una stanza d’immagine, quindi è così
interessante
ciò significa che l’azione è ancora in
lì e non è stato rimosso quali mappe
con l’ idea che cancellare era falso così
di nuovo non saltare alla conclusione non lo è
perché stiamo vedendo come l’ immagine
reazione qui che questo significa questo
questa è la causa delle falle come noi
può vedere riferimenti forti qui, ma questo
scusa vediamo riferimenti deboli qui è a
deboli mappa di hash quindi questo non è che sia da
stesso causando una perdita, ma in qualche modo
ci gioca così abbiamo quell’azione e
non è annullato e non rimosso
significa che la richiesta di annullamento non è stata chiamata
ma abbiamo visto che chiamiamo richieste di annullamento
così sono tornato e ho guardato questo
classe e io ero come va bene chiamiamo
quel metodo diamo un’occhiata a cosa
L’istanza di Picasso si trova su quell’oggetto quindi io
guardò l’oggetto Picasso e poi io
l’ho aperto e ho guardato l’obiettivo
azione e vedo zero qui così ho avuto due
istanze di Picasso e uno di loro aveva
l’obiettivo all’azione che ho aggiunto e
l’altro aveva zero ma quello
aveva zero era quello che è stato referenziato
dal punto di vista quindi significa che questo è il
sbagliato Picasso fondamentalmente cosa sta succedendo
ecco che stiamo ricevendo una richiesta
creatore di Picasso da un altro
Istanza di Picasso e poi chiamiamo cancel
richiesta sull’istanza di Picasso sbagliata così
non stiamo cancellando nulla ed è così
stavamo creando quella memoria
stavamo annullando la registrazione da quello sbagliato
Non avrei potuto capirlo con me
forse potrei avere a posteriori
guardando i dati ho trovato alcuni modi
che avrei potuto farlo ma è così
molto più facile quando si può frugare
memoria quindi è per questo che il download del
la discarica dell’heap alla fine ti aiuta davvero
va bene, quindi mi piace attraversare a
riassunto così l’idea l’idea generale è
non correre alle conclusioni che stai per
vedi un sacco di lezioni che conosci
aspetta un minuto e pensa a cosa
significa e poi cercare di sapere cercare
istanze ci dovrebbe essere quindi il primo
la cosa è come tornare all’inizio
i principi non saltano alle conclusioni
quindi prova a trovare gli oggetti che dovrebbero
essere morto e gli oggetti che dovrebbero essere
vivo questo è davvero quello che sta per
aiutare a capire ciò che è sbagliato e
allora puoi sapere dividere la perdita
traccia in due punti trova il riferimento
per uccidere e spero che tu possa farlo
sistemati le spalle così questa è la tua ultima notte
puoi scrivere questa sessione inviare domande
e questo è tutto

Please follow and like us: