Livres recommandés
performances Android Market optimisation peu de livres
Parce que cette petite optimisation des performances un peu plus, la profondeur et l'étendue des connaissances impliquant relativement grande, et l'optimisation des performances dépendent de plates-formes connexes d'outils et de compétences analytiques, la polyvalence et l'efficacité de plomb sans trop élevé, de sorte que le contenu des livres suivants comparer également goûté
Évaluation de la performance et l'optimisation des applications
- bon dans l'ensemble, mais les exemples donnés dans la scène plus inhabituel pour le travail quotidien est de développement
- Optimisation du réseau Ce chapitre est écrit dans le meilleur sentiment, le sentiment du début de lecture à travers beaucoup d'inspiration, nous continuons à mordre
combat de performance mobile Android
- Outils introduit plus
- Les exemples donnés sont plus fréquents, mais l'introduction de relativement illisible
- Entrainment de marchandises de contrebande
Application Android Performance Optimization
- La connaissance et l'optimisation couche JNI de parler de plus
- Après le retrait du contenu plus comme une partie d'un des conseils JNI, le contenu plus décontracté
Signification analyse des performances de la mémoire et l'optimisation
Vue d'ensemble de la gestion de la mémoire
Gestion de la mémoire Présentation
OOM
- la mémoire système allouée à l'application est une limite supérieure, pas la quantité de mémoire du système est l'application de repos peut être utilisé beaucoup, getMemoryClass () peut arriver à cette valeur
- LargeHeap peut être fourni dans le fichier manifeste vrai, il va augmenter la limite supérieure de la mémoire tas, getLargeMemoryClass () cette valeur peut être acquise
- La mémoire virtuelle de tas de machine au-delà du plafond causera OOM
Tueur à faible mémoire
- gestionnaire de mémoire Android utilise la pagination (pagination) et la cartographie de la mémoire (mémoire mapping) la technologie, mais ne pas utiliser swap, mais l'utilisation de stratégies à faible mémoire Killer pour améliorer l'utilisation de la mémoire physique, ce qui entraîne dans le processus de récupération en plus de tuer et gc de mémoire physique à l'extérieur aucune autre façon de tirer parti de la mémoire déjà occupée
- Après la station en cours de changement d'application à l'arrière-plan, le système ne se termine pas le processus, mais il mis en mémoire cache pour le prochain démarrage. Lorsque la mémoire du système est faible, selon la priorité de libération moins récemment utilisé + stratégie de sortie de la mémoire cache à l'aide processus intensif.
GC
- Utilisation de la mémoire peut aussi causer des bas slows multi-GC, ce qui Caton
- Utilisation de la mémoire est trop élevée, lorsque vous créez des objets de mémoire, il peut facilement conduire à déclencher GC affecter les performances de l'APP
en résumé
Attention, et de réduire la consommation de mémoire l'application peut réduire la probabilité d'OOM, une meilleure expérience utilisateur dans la scène tendue de la mémoire, les applications de fond peuvent également augmenter le temps de survie
introduction aux outils
enquête sur l'utilisation de la RAM
- GC-LOG
- dumpsys meminfo
- Profiler
- jhat
dumpsys procstats
Utilisé pour mesurer la situation sur une période de consommation de mémoire d'application
- PSS: Set proportionnelle Taille de la mémoire réelle mémoire partagée allouée au pro rata
- USS: ensemble unique processus Taille de la mémoire privée
- PSS = + USS mémoire partagée / mémoire partagée, nombre de processus
(USS moyenne maximale USS- moyenne maximale de PSS- minimum PSS- PSS / minimum USS-)
procstats.png
LeakCanary
outils de détection des fuites de mémoire
MAT
Plus couramment utilisé outil d'analyse de fichier de vidage de la mémoire
utilisation
- Utilisez la mémoire de profils de données de mémoire de vidage
- MAT hprof fichier exporté n'est pas le fichier standard, vous devez utiliser la ceinture sdk conversion hprof-conv
Les scénarios d'utilisation
- Apprendre à identifier les goulots d'étranglement optimisation de la mémoire
- Fichiers de vidage de la scène seulement réel, ou vous ne pouvez pas localiser les problèmes spécifiques de seul domaine sans la moindre idée et Paodingjieniu cas d'outil
- Optimisation de la mémoire pour la fonction spéciale de sentir le code inférieur débogage + profileur
Analyse la scène à construire
tests de performance quelques notes
- Essayez de considérer la scène réelle
- Nous devons fermer les journaux et d'autres composants de débogage pour éviter les interférences
Test de caractéristiques communes
- Passer à l'arrière-plan
- À plusieurs reprises exécuter la fonction
- Fonction de longue durée
- Une pluralité de scènes de commutation dans les deux sens
Enclin à des scènes de problèmes de mémoire
- Il contient une interface d'affichage d'image
- La transmission de grandes quantités de données de la scène
- Nécessité de cache scène de données
Problèmes courants mémoire
fuite de mémoire
Les raisons de fuites de mémoire générées
Le cycle de vie d'un objet a pris fin, mais il y a d'autres exemples d'objets pour tenir son avance dans le GC ne peuvent pas être récupérés, généralement l'activité dans Android après la référence finition objet encore que la cause des fuites de mémoire
fuites de mémoire commune scène
- Dans la logique opération asynchrone asynchrone ne se termine pas, l'activité de fin ou remises à neuf
- Discussion / Gestionnaire / AsyncTask / Rxjava / Timer, etc.
- Exemple variable statique ou un seul exemple direct ou indirect, mais non enregistrés activty la libération rapide des
- Inscrivez-vous diffuser sans se déconnecter
- ObjectAnimator annuler est pas appelé
- opération E / S n'est pas complète après la sortie ou à proximité du
- WebView causée par une fuite de mémoire Android 5.1 WebView analyse des fuites de mémoire
Une fuite de mémoire dans les outils d'analyse de la performance
Fuite de mémoire .png
Chaque activité de reconstruction se traduira par une plus grande mémoire et de réduire l'utilisation de la mémoire ne fait pas gc
fuites de mémoire Évitez
- LeakCanary
- StrictMode
- L'activité est pas nécessaire d'utiliser l'endroit comme un contexte toute utilisation ApplicationContext
- Utilisez WeakReference
- Utilisez les outils ViewModel + LiveData / RxJava + Rxlifecycle tels que la logique asynchrone éviter les fuites de mémoire
- Lorsque vous utilisez le besoin de processus à détruire pour vérifier si l'opération xxx.cancel () / xxx.close () / xxx.unregister () / xxx.remove (), etc.
mémoire Jitter
La raison mémoire de gigue
La mémoire est généralement secouez créer instantanément un grand nombre d'objets, GC va déclencher plusieurs fois dans un court laps de temps, ce qui Caton
Secouez la mémoire de la scène
- IM besoin de notification à transmettre à toutes les interface WebView, il suffit d'ouvrir l'APP lorsque plusieurs notifications arrivent simultanément ou dans un message de chat de groupe sous beaucoup de scènes, un court laps de temps peut causer des fréquentes GC, accompagné l'interface Caton
performances Jitter sur l'outil d'analyse de la mémoire
gigue mémoire .jpg
Créé une gigue de mémoire de scène
testThrashing public void (booléen needLog) { dimension int = 300; int lotsOfInts = new int ; Au hasard generateurAleatoire = new Random (); pour (int i = 0; i < lotsOfInts.length; i ++) { for (int j = 0; j < lotsOfInts .length; j ++) { lotsOfInts = RandomGenerator.nextInt (); } } // Il y a optimisation pour (int i = 0; i < lotsOfInts.length; i ++) { Chaîne rowAsStr = ""; int = GETSORTED triés (lotsOfInts ); for (int j = 0; j < lotsOfInts .length; j ++) { rowAsStr + = trié ; if (j < (LotsOfInts .length - 1)) { rowAsStr + = ""; } } si (needLog) { Log.i (TAG, "ligne" + i + ":" + rowAsStr); } } } optimizeThrashing public void () { dimension int = 300; int lotsOfInts = new int ; Au hasard generateurAleatoire = new Random (); pour (int i = 0; i < lotsOfInts.length; i ++) { for (int j = 0; j < lotsOfInts .length; j ++) { lotsOfInts = RandomGenerator.nextInt (); } } Après optimisation // StringBuilder sb = new StringBuilder (); pour (int i = 0; i < lotsOfInts.length; i ++) { sb.delete (0, sb.length ()); int = GETSORTED triés (lotsOfInts ); for (int j = 0; j < lotsOfInts .length; j ++) { sb.append (trié ); if (j < (LotsOfInts .length - 1)) { sb.append ( ""); } } Log.e (TAG, "ligne" + i + ":" + sb); } }- Sentez-vous leurs propres tests, gc a Caton en fait est pas évident (il peut être moins compliquée démonstration, GC prend peu de temps)
- Caton sentiment personnel est principalement parce que la gigue de mémoire dans la plupart des scènes complexes, généralement accompagnée d'un certain nombre de faire fonctionner le fil conducteur est apparu Caton, et la mémoire fréquente gigue GC induite pourrait exacerber le Caton
solutions
- La façon la plus simple est de mettre en service avant que le thread principal au fil de l'enfant, bien que la mémoire tremble encore, mais le problème peut être grandement atténué Caton
- Pour mémoire elle-même secouer
- Essayez d'éviter de créer des objets en circulation in vivo, in vitro du cycle doit être déplacé pour créer des objets
- Lorsque cela est nécessaire l'utilisation extensive de Bitmap et d'autres gros objets, les objets créés pour essayer autant que possible avant de les réutiliser
- Pour boîte noire (par exemple, la gigue de webview et la mémoire principale dans l'exemple précédent en raison des opérations consommatrices notification fil im)
- contrôle de la fréquence de déclenchement, le degré carte Atténuer Dayton
- mécanisme d'enregistrement Ajouter est nécessaire pour recevoir des notifications avant de l'envoi de notifications
Photos de l'empreinte mémoire chargée
Image de l'effet sur la mémoire dans des dossiers différents dpi
- Différents dpi dpi qualificatif correspondant
xxxhdpi-640
xxhdpi-480
xhdpi-320
mdpi-160
- La largeur et la hauteur de la charge est calculée par la Bitmap Resid
largeur de l'image en mode point et la hauteur = largeur et la hauteur de l'écran * dpi / dpi correspondant au dossier
- nodpi
Chargé de ce dossier images bitmap ressources générées demeurera la taille de l'image elle-même
- 1920 * 1080 ressources d'image dans un autre dossier pour charger le calcul de la taille Bitmap
Utiliser un équipement de note millet, l'appareil 440 dpi
.Png image de chargement
- Utilisez la suggestion de l'image
- La figure faire usage de la taille de coupe de 1080p
- Essayez de mettre l'image dans le dossier ci-dessus xxhdpi
- Les images plus grandes telles que les pages et le guide Splash page dossier nodpi, en contrôlant la taille de l'image afin de limiter la taille ImageView
- Selon l'opération ci-dessus provoque une augmentation de la taille des apk, les images peuvent être compressées et converties en WebP
RGB565
En plus du dossier d'image de fichier de ressources, le mode couleur utilisé lorsque les images de chargement affectent également la taille de l'image. ARGB8888 utilise 32 bits, il faut un 4byte de pixels, les utilisations RGB56516bit, seulement 2 octets de pixels
Mais parce que moins RGB565 la transparence du canal alpha de l'image montre un problème, et montrer une certaine différence, en effet, il est donc recommandé de ne pas modifier cet attribut, mais peut être optimisé comme un moyen spécial sur les lieux, il y a des exigences strictes en matière de mémoire
Impact sur la mémoire de ProGuard
Et les ressources de code comprimé
- ProGuard peut classe, méthode et renommage, suppression du code inutile et les ressources, la taille réduite de Dex, en plus de réduire la taille de l'APK, mais réduit également la mémoire nécessaire pour charger le Dex
- Parce que la machine virtuelle Jiazai fichiers dex sont chargés à la demande, et est la plus petite unité de la page d'allocation de mémoire, de sorte Jiazai le même fichier de page de mémoire chargera le code dex hors de propos avant et après le code de fonction est une fonction de, ProGuard peut re commande fichiers bytecode en position de Dex, de telle sorte que chaque classe de dex relation d'appel plus compact, la charge nécessaire pour la même fonction mémoire plus petite
la fragmentation de la mémoire
Vue d'ensemble de la gestion de la mémoire
la fragmentation de la mémoire
L'algorithme de collecte des ordures de Davik ne peut pas déplacer un objet, il fera un petit objets occupent la page entière de la mémoire, la fragmentation de la mémoire
L'ART machine virtuelle peut trier l'espace mémoire dans la GC, avec la part de plus de 5,0 système progressivement améliorée, la fragmentation de la mémoire peut causer des besoins de consommation de mémoire ne pas être trop préoccupé par
D'autres problèmes de mémoire
Gérer la mémoire de votre application
- les ressources de libération UI lorsque vous recevez la page onTrimMemory (de TRIM_MEMORY_UI_HIDDEN) n'est pas visible
- () Pour obtenir des informations de la mémoire getMemoryInfo, pour veiller à ce qu'ils ne conduisent pas à ouvrir grand oom mémoire
- Utilisez le service de prudence
- Utilisez IntentService
- Utilisez JobScheduler pour la planification d'arrière-plan
- Les conteneurs utilisés pour optimiser analogues SparseArray
- Code abstrait apportera la consommation de mémoire supplémentaire
- Utilisez @ IntDef, @ lieu StringDef de recensement
- ...
[Attaché] architecture et des informations connexes
collecte des données
Regarder + réponse privée lettre, libre accès « données Andrews »!
De plus le groupe pour obtenir de recevoir l'architecture de haut niveau de données Android, code source, notes, vidéo. Interface utilisateur principale, optimisation des performances, des cours d'architecte, NDK, développement hybride (ReactNative + Weex) applet micro lettre, pratique avancée Flutter Android tous les aspects de la technologie, ainsi que dans le groupe pour discuter de l'échange de la technologie Daniel résoudre le problème.