Java pour les développeurs Android

Utiliser le Garbage Collector

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Le Garbage Collector est un récupérateur de mémoire. Initiez-vous à son fonctionnement et observez de quelle manière il recycle la mémoire.
09:46

Transcription

Dans cette vidéo, nous allons voir le principe du « Garbage Collector », et comprendre comment travailler les fuites mémoire. Pour commencer, on va rajouter la notion d'âge à notre élève. Je vais lui rajouter « public int age ». Il a un nouvel attribut : un âge. Cet âge, quand on va l'ajouter, on va lui donner un âge aléatoire, c'est-à-dire « eleve.age = ». Pour faire de l'aléatoire, il y a une classe Java qui s'appelle « Random », qui permet de créer des chiffres aléatoires. « Random random = ». Je crée « new Random ». À partir de cet objet « Random », je vais pouvoir générer des chiffres aléatoires, en faisant un « nextInt » qui me renvoie un chiffre aléatoire. Si je veux un chiffre aléatoire entre 0 et 100, il me renvoie un chiffre entre 0 et 99. Il suffit d'aller voir la doc pour comprendre tout le détail de l'aléatoire, comment il génère son aléatoire, mais là, on rentre dans les mathématiques. Jusque là, rien d'exceptionnel, j'ai juste rajouté mon âge, je ne vais même pas l'afficher, ça ne m'intéresse pas pour ce que je veux montrer. Ici, qu'est-ce que j'ai fait ? J'ai créé un « Random », j'ai fait un « new ». En gros, j'ai pris de l'espace mémoire où il va stocker cette classe-là. Admettons que ce nb soit égal à 10 000. Je vais donc faire tout ce qu'il y a ici 10 000 fois. Je vais créer 10 000 élèves et je vais aussi créer 10 000 fois la classe Random. Ça va prendre tout un espace dans la mémoire. Mais, une fois que j'ai fini une seule itération, l’élève, on le conserve puisqu'on va le mettre dans l'« ArrayList. » Par contre, notre « Random », on ne le conserve pas. Il part, on ne l'utilise plus. Cet espace mémoire, on pourrait le réutiliser à autre chose. Il existe en Java, et dans certains autres langages, la notion de « Garbage Collector. » Il va parcourir la mémoire de votre application et regarder tout ce que vous n’utilisez plus et tout ce que vous n'utilisez plus, il va le déclarer comme vide, donc vous allez pouvoir réutiliser cette mémoire. Ça s’appelle le « Garbage Collector. » Si je prends ce morceau de code-là et que je le sors, par exemple et que je le mets ici, je vais créer une fois la classe « Random », et derrière, je ne vais l'utiliser de la même manière mais je ne l'aurais créé qu'une fois. À chaque tour d'itération, je ne vais pas recréer un objet, donc reprendre de la place mémoire, pour l'abandonner juste derrière. Donc, derrière, mon « Garbage Collector » n'aura pas besoin de passer pour libérer tous mes « Random » que j'aurais créés, car ça, ça ne prend pas de place en mémoire. Tout ce qui prend de la place en mémoire, c'est les « new » quelque chose. On va faire cette démonstration. Je vais reprendre le « Random » et le mettre ici. Je vais créer une deuxième méthode Ajouter, que je vais appeler « ajouterOpti », pour « optimiser », et je vais sortir ce « Random. » Donc, j'ai deux versions de Ajouter. Quand je vais appuyer sur le bouton « Ajouter », au lieu d'en ajouter un, je vais en ajouter 100 000. Pour éviter d'avoir à faire des chargements graphiques d'une chaîne de caractères immense, je vais prendre ma liste, et juste derrière, je vais l'effacer. En gros, j'aurais créé 100 000 élèves, et juste derrière, je vais tous les effacer. Quand je dis que je vais les effacer, je vais juste dire que je ne les utilise plus. Donc, le « Garbage Collector » pourra, quand il le souhaite, passer pour effacer toute cette mémoire. Dans « supp_dernier », je vais mettre ces deux lignes-là en commentaire. Je vais faire exactement pareil, sauf qu'au lieu d'appeler « ajouter », je vais appeler « ajouterOpti ». La même version, mais avec le « Random. » Je n'aurais créé en fait, qu'une seule fois le « Random », alors qu'ici, je l'aurais créé 100 000 fois. Je lance mon application. Mon application est lancée. Je vais afficher l'Android Monitor. On a plusieurs éléments qui peuvent être testés. Là, en l'occurrence, ce que je veux tester, c'est la mémoire. Je peux ouvrir ou fermer les éléments. Histoire de bien voir, je vais mettre celui-là en valeur. Ici, je peux forcer l'appel du « Garbage Collector. » Le « Garbage Collector » n'est pas en train de tourner constamment, sinon, ça prendrait du temps, ça ralentirait les applications. Du coup, on peut forcer son appel. Là, par exemple, je vais appuyer dessus et ça va forcer l'appel. On peut voir que le trait bleu, qui est la mémoire qui est allouée, a diminué parce qu'il a libéré de l’espace mémoire. La partie bleue, c'est la mémoire qui est utilisée. La partie marron, c'est la mémoire qui est allouée. Premier cas : qu'est-ce qui se passe si le trait bleu rattrape le trait marron ? L'application va demander à l'appareil de lui allouer plus de mémoire, donc, on verra ce trait-là monter. Faisons notre expérience. Je vais commencer par la version normale, j'appuie sur « Ajouter ». Là, on voit qu'on a fait nos appels. Il a commencé. Ici, il a atteint la limite. Du coup, il a fait une demande de mémoire. On voit que le trait gris est monté. Il a continué ses itérations. Ici, il est redescendu. C'est-à-dire qu'il y a eu un petit appel du « Garbage Collector. » Il a continué. Il a réatteint la limite, donc il a refait un appel. Il a continué à monter. On voit que c'est un peu une perte de temps de faire ça. Le « Garbage Collector » fait perdre un peu de temps. Là, on était très proche de la limite. Il a attendu, il a vu qu'on ne faisait rien, donc, il a fait un appel au « Garbage Collector » qui est retombé. Si je relance le « Garbage Collector », je redescends. Pourquoi ? Ici, comme il a déclenché lui-même le « Garbage Collector », il n'en a fait que sur une partie pour éviter de saturer l'application. Là, je lui ai demandé de le faire, donc il l'a fait en entier, il a libéré tout ce qu'il pouvait. On va noter un peu des chiffres maintenant. Une fois le « Garbage Collector » appelé, là, si je le rappelle, il ne se passe rien. Je suis à 5,20. Je le note ici. J'appuie sur « Ajouter », la version non optimisée, et je monte à 12,07. « ajouter : 12.07 ». J'appelle le « Garbage Collector. » Il me redescend à 5,20. Maintenant, j'appelle la version optimisée. On a donc eu un gros pic, on est redescendu immédiatement. On a beaucoup moins d'objets, on n'a pas eu nos 100 000 « Random. » Du coup, je ne peux même pas voir jusqu'où on a été. On voit que la performance a quand même été beaucoup plus rapide. Il a réussi à monter en pic direct. Je vais rappeler le « Garbage Collector. » Je vais essayer de faire les deux vite pour qu'on puisse voir la différence. Il a fini, j'appelle le « Garbage Collector. » Et j'appelle celui-là. Si on regarde et qu'on compare les deux, on voit qu'il y en a un qui demande beaucoup plus de mémoire, qui prend beaucoup plus de temps à être effectué. Si on prend en termes de temps, celui-là est plus long. Il a rappelé le « Garbage Collector » en plein milieu pour essayer d'éviter d'avoir à faire une demande mémoire. Ce que j'ai voulu vous montrer dans cette vidéo, c'est que malgré qu'il existe un « Garbage Collector » qui nous évite d'avoir à gérer notre mémoire en Java, comme on doit le faire en C, il faut quand même faire attention. Notre exemple avec le « Random » est négligeable. Mais mis à grande échelle, cela peut faire ramer votre application. Grâce à cet analyseur de mémoire, on va aussi pouvoir détecter les fuites mémoire. Imaginons que j'appelle une méthode. Mon application alloue de la mémoire pour créer les objets nécessaires. Du coup, ma courbe augmente. Une fois la méthode terminée, le « Garbage Collector » passe mais n'arrive pas à tout libérer. Donc, ma courbe redescend, mais ne redescend pas à sa zone initiale. Donc, à chaque fois que j’appellerai cette méthode, ma courbe augmentera mais ne redescendra pas à son état initial. Dans la moyenne, on va voir des pics mais, petit à petit, on va monter en utilisation mémoire. Donc, à chaque fois que j’appellerai cette méthode, j’ajouterai un espace non libérable tant que je ne redémarre pas mon application. C'est ce qu'on appelle une fuite mémoire. Mais rassurez-vous : pour le moment, avec ce que nous avons appris, vous ne pouvez pas encore faire de fuite mémoire.

Java pour les développeurs Android

Prenez en main la syntaxe et les concepts de Java pour vos développements d’applications pour Android. Abordez les variables, les chaînes de caractères, les conditions, etc.

7h01 (65 vidéos)
Aucun commentaire n´est disponible actuellement
Logiciel :
Spécial abonnés
Date de parution :24 avr. 2017

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !