l'évaluation des performances Android et optimisation - Mémoire

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
hprof-conv -Z src dst // - z peut exclure des objets cadre androïde créé

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.

La société a gagné 100 millions d'années de cuisine à la télévision au lieu de jouer pour nourrir Nicholas Tse Faye Wong ambitions encore plus grandes
Précédent
Lecture module de commande: toujours classique! RX-78-2 GUNDAM ver1.0
Prochain
Cette histoire de côté « Harry Potter » pour que Feng Xiaogang est pas calme l'acteur Prince William étudiants
CNCC 2016 | Université de Tsinghua Académicien Zhang Bo du fond: l'intelligence artificielle pour apprendre la profondeur des temps
Hulu ce drame adapté de l'affaire de matricide très réelle de réexaminer la relation entre l'amour de la famille et la haine
La Chine est devenue le domaine de la Choura de détail, Costco et autres supermarchés basée sur l'adhésion dont les idées peuvent apporter?
module de commande de lecture: HGUC petit robot et espion HGUC Jim
Facile à apprendre à connaître le principe directeur couche de masque personnalisé
Crise Les relations publiques est de continuer à mentir, mais le mensonge aux médias et le public, vous ne pouvez pas la vie triche
Produit avec la marque, Mengniu voir comment jouer le marketing Tanabata?
malédiction Feng Wang Jianlin mis en scène le drame: Sicong a répondu nausées Feng a dit qu'il était debout
module de commande de lecture: style samouraï, MG Musha jusqu'à MK-
Ces télévision américaine à Netflix à la fin, je prends cette occasion pour mettre quelques pièces Li Li
le point Tanabata seul, de manger un grand repas Guangzhao Auto Show