Maison  >  Article  >  tutoriels informatiques  >  Liste des catégories et situations de fuites de mémoire

Liste des catégories et situations de fuites de mémoire

王林
王林avant
2024-01-14 19:48:371025parcourir

Liste des catégories et situations de fuites de mémoire

Les fuites de mémoire sont généralement divisées en plusieurs situations

Les fuites de mémoire courantes sont causées par plusieurs exécutions de code. Une fuite de mémoire se produit à chaque exécution.

2. Les fuites de mémoire sporadiques font référence au code dans lequel les fuites de mémoire se produisent uniquement dans certains environnements ou opérations spécifiques. Ce type de fuite de mémoire ne se produit pas de manière continue, mais occasionnelle. Cependant, il est important de noter que les fuites de mémoire sporadiques peuvent devenir fréquentes dans certaines circonstances. Par conséquent, l’environnement de test et les méthodes de test sont des facteurs très importants lors de la détection des fuites de mémoire.

Une fuite de mémoire ponctuelle signifie que le code dans lequel la fuite de mémoire se produit ne sera exécuté qu'une seule fois, ou qu'en raison de défauts d'algorithme, il y aura toujours une et une seule fuite de mémoire. Par exemple, la mémoire est allouée dans le constructeur d’une classe, mais la mémoire n’est pas libérée dans le destructeur. Puisqu’une seule instance de cette classe existe, la fuite de mémoire ne se produira qu’une seule fois. Dans ce cas, la fuite de mémoire ne se reproduira pas, mais elle entraînera quand même un gaspillage de ressources mémoire et dégradera les performances du système. Par conséquent, lors de l’écriture du code, nous devons accorder une attention particulière pour éviter les fuites de mémoire ponctuelles.

4. Une fuite de mémoire implicite signifie que la mémoire est fréquemment allouée pendant l'exécution du programme, mais n'est libérée qu'à la fin du programme. À proprement parler, il ne s’agit pas d’une véritable fuite de mémoire, car la mémoire finira par être libérée. Cependant, pour les programmes serveur à exécution longue, si la mémoire n'est pas libérée à temps, le système peut éventuellement manquer de mémoire. Par conséquent, nous appelons cette situation une fuite de mémoire implicite. Cette fuite de mémoire ne pose pas de problème immédiat, mais au fil du temps, elle peut avoir un impact négatif sur les performances et la stabilité du système. Afin d'éviter les fuites de mémoire implicites, les développeurs doivent libérer la mémoire inutilisée en temps opportun pour garantir le fonctionnement normal du système.

Dans quelles circonstances une fuite de mémoire se produira-t-elle en Java

La fuite de mémoire fait référence à des objets ou des variables qui ne sont pas utilisés par le programme et occupent de la mémoire pendant une longue période. En Java, il existe plusieurs situations de fuites de mémoire.

Les objets de longue durée contenant des références à des objets de courte durée peuvent provoquer des fuites de mémoire. Par exemple, dans un système de cache, nous chargeons un objet dans le cache et le plaçons dans l'objet cartographique global, mais l'objet n'est alors plus utilisé. Cependant, l'objet est toujours référencé par le cache et ne peut pas être libéré. Dans ce cas, les objets qui ne sont plus utilisés doivent être nettoyés à temps pour éviter les fuites de mémoire.

Pour les variables de collection globales, s'il n'y a pas de mécanisme de suppression correspondant, l'utilisation de la mémoire ne peut qu'augmenter plutôt que diminuer. Il est donc nécessaire de prévoir un mécanisme de suppression ou une stratégie de nettoyage régulière.

Une utilisation incorrecte du modèle singleton est un problème courant de fuite de mémoire. Une fois l'objet singleton initialisé, il existera (sous forme de variables statiques) tout au long du cycle de vie de la JVM. Si l'objet singleton contient une référence à un objet externe, l'objet externe ne sera pas recyclé normalement par la JVM, ce qui entraînera une fuite de mémoire.

La différence entre le débordement de mémoire et la fuite de mémoire, causes et solutions

Un débordement de mémoire (mémoire insuffisante) signifie que lorsqu'un programme demande de la mémoire, une erreur se produit en raison d'un espace mémoire disponible insuffisant et ne peut pas répondre aux besoins du programme. Par exemple, si le programme demande un espace mémoire de type entier, mais doit en réalité stocker une valeur pouvant être prise en charge par un entier long, une erreur de dépassement de mémoire se produira. Dans ce cas, le programme ne peut pas fonctionner normalement et le problème doit être résolu en augmentant la mémoire disponible ou en optimisant la logique du programme.

Fuite de mémoire Une fuite de mémoire signifie qu'une fois qu'un programme a demandé de la mémoire, il ne peut pas libérer l'espace mémoire demandé. Les dommages causés par une fuite de mémoire peuvent être ignorés, mais les conséquences de l'accumulation de fuites de mémoire sont graves, quelle qu'en soit la raison. Si beaucoup de mémoire est disponible, elle sera occupée tôt ou tard.

Une fuite de mémoire finira par entraîner un manque de mémoire !

Cause :

1. La quantité de données chargées dans la mémoire est trop importante, par exemple en récupérant trop de données de la base de données à la fois ;

2. Il y a une référence à l'objet dans la classe collection, qui n'est pas effacée après utilisation, ce qui rend la JVM incapable de recycler

 ;

3. Il y a une boucle infinie dans le code ou la boucle génère trop d'entités d'objet en double ;

4. BUG dans le logiciel tiers utilisé ;

5. La valeur de la mémoire du paramètre de démarrage est trop petite

Solution :

1) Lors du traitement de la transmission de données de certains flux IO, essayez de désactiver le flux IO à la fin

2) Lors du traitement des photos téléchargées, utilisez BitmapFactory.options. Définissez la méthode insameplesize() pour compresser les images afin de réduire l'utilisation des ressources ; un sujet spécial sera écrit ci-dessous sur les problèmes de compression d'images ;

3) Vous pouvez également réduire la mémoire occupée en réduisant les pixels des photos

4) Recyclage des ressources : Bitmap.recycle()bitmap=null;

5) Essayez d'utiliser des variables globales et évitez les nouveaux objets

Les fuites de mémoire elles-mêmes ne causeront aucun dommage. En tant qu'utilisateur ordinaire, ils ne ressentiront pas du tout l'existence de fuites de mémoire. Ce qui est vraiment néfaste, c'est l'accumulation de fuites de mémoire, qui finiront par consommer toute la mémoire du système. De ce point de vue, une fuite de mémoire ponctuelle n’est pas nuisible car elle ne s’accumule pas, alors qu’une fuite de mémoire implicite est très nocive. Faire planter le programme ;

Comment résoudre le problème de fuite de mémoire interne

Oui. La raison pour laquelle Java provoque des fuites de mémoire est très claire : si un objet à durée de vie longue contient une référence à un objet à durée de vie courte, une fuite de mémoire est susceptible de se produire, même si l'objet à durée de vie courte n'est plus nécessaire, car l'objet à durée de vie longue n'est plus nécessaire. L'objet vécu conserve sa référence. Par conséquent, il ne peut pas être recyclé. C'est le scénario dans lequel des fuites de mémoire se produisent en Java.

1. Classe Collection, la classe collection n'a que des méthodes pour ajouter des éléments, mais n'a pas de mécanisme de suppression correspondant, ce qui entraîne une occupation de la mémoire. Ce n'est en fait pas clair. Si cette classe de collection n'est qu'une variable locale, cela ne provoquera pas du tout de fuite de mémoire. Une fois la pile de méthodes terminée, il n'y aura aucune référence et elle sera recyclée normalement par la JVM. Et si cette classe de collection est une variable globale (comme les attributs statiques de la classe, la carte globale, etc., qui ont des références statiques ou final pointant toujours vers elle), alors il n'y a pas de mécanisme de suppression correspondant, ce qui est susceptible de provoquer le la mémoire occupée par la collection augmente plutôt que diminue, il est donc nécessaire de prévoir un tel mécanisme de suppression ou une stratégie de nettoyage régulière.

2. 2. Mode singleton. Une mauvaise utilisation du modèle singleton est un problème courant qui provoque des fuites de mémoire. Après avoir été initialisé, l'objet singleton existera tout au long du cycle de vie de la JVM (sous la forme de variables statiques). object, Alors cet objet externe ne sera pas recyclé normalement par la jvm, ce qui entraînera une fuite de mémoire. Prenons l'exemple suivant : class A{

.

3. public A(){

4. B.getInstance().setA(this);}

5....}

6. //La classe B adopte la classe B en mode singleton{

7. privé Aa;

8. instance B statique privée = new B();

9. public B(){}

10. public statique B getInstance(){

11. instance de retour ;}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer