0
votes

Comment ne pas faire référence à un objet quand il n'est pas utilisé, il est donc supprimé par Garbagecollection

J'ai une liste de matrices qui auront constamment différentes quantités d'articles dedans.

Ce ne sera pas supprimé quand il est vide.

Peut-on causer des fuites de mémoire?

Je vois que les gens disent à faire quelque chose éligible à la collecte des ordures que vous devez le désaffecter. Qu'est-ce que cela signifie?


1 commentaires

Dire si cela causerait des fuites de mémoire ou non est très difficile sans code réel. En général, cela pourrait, mais dépend de beaucoup de choses (c'est pourquoi je ne pose pas une réponse et je me limite à commenter). Pour rendre quelque chose éligible à la collecte des ordures, vous pouvez le pointer sur null (mais que quelque chose peut être éligible à la collecte des ordures pour d'autres raisons).


3 Réponses :


1
votes

Un tableau vide n'est pas un risque de fuite de mémoire.

Les fuites de mémoire se produisent lorsqu'une collection accepte des références illimitées. Il est difficile de voir comment une liste vide sera un problème.

Un objet qui a une référence à une liste vide la gardera en mémoire.

Le collecteur des ordures marquera un objet comme éligible à la collecte des ordures lorsque aucun autre objet ne l'a fait référence. Toutes les références à cet objet doivent être supprimées.


0 commentaires

1
votes

Vous pouvez définir une référence à NULL à "DEF-référence". Comme ceci, par exemple: xxx

en Java lorsque rien ne pointe sur l'objet (il n'y a aucune référence à l'objet), l'objet est "admissible" pour le collecteur des ordures.

En ce qui concerne les fuites de mémoire, cela dépend vraiment de votre situation, mais il est possible d'avoir des fuites en raison de la non-référencement.


0 commentaires

0
votes

Les développeurs parlent parfois de "fuites de mémoire" en Java. Ce qu'ils veulent dire, c'est qu'ils ont beaucoup de mémoire alloué qu'ils n'exigent plus, mais en principe l'application pourrait faire référence si elle voulait. Ceci est différent de la "fuite de mémoire classique" que vous verriez dans une langue comme "C" lorsque l'application doit explicitement attribuer une mémoire de transaction. Comme cette question concerne Java, je ne me préoccuperai pas de la "fuite de mémoire classique", mais je comprends simplement que les deux sont différents

@ @ HDW3 correctement états, dans Java, un objet est éligible pour la collecte des ordures si vous n'en avez aucune référence. Il s'agit d'un cas spécifique d'une règle plus générale - un objet est éligible à la collecte des ordures si elle ne peut en aucun cas être référencée par votre demande. Il y a une différence subtile mais importante ici ...

cas 1 Si vous avez une référence à l'objet 'A' et que cet objet a une référence à l'objet 'B'. (Cela pourrait être votre arraylist si contient un seul élément.) Aucun objet n'est admissible à la collecte des ordures que la chaîne peut être référencée dans la liste.

Dès que vous perdez le référencé à votre premier objet, aucun objet n'est accessible à partir de votre application, de sorte que les deux deviennent éligibles pour la collecte des ordures.

cas 2 Imaginez que vous avez une référence à l'objet 'A' et cet objet a une référence à l'objet 'B' et à l'objet 'B' a une référence à l'objet 'A'. Les objets 'A' et 'B' sont tous deux accessibles, donc non plus admissibles à la collecte des ordures.

Dès que vous perdez votre référence à l'objet 'A', alors 'B' devient également inaccessible. Les deux objets deviennent éligibles pour la collecte des ordures, même s'ils se réfèrent mutuellement.

Vous pouvez perdre votre référence à l'objet de différentes manières différentes.

  1. La voie habituelle consiste simplement à quitter une méthode qui a la seule référence à l'objet.
  2. comme @ HDW3 souligne la réaffectation de votre référence afin que cela pointe quelque chose
  3. Quelque chose appelé "Softreferences" existe, mais il suffit de vous inquiéter d'eux si vous mettez en œuvre de grandes caches.

    Ce que vous trouverez, c'est que, à Java, le collecteur des ordures fait presque toujours la bonne chose pour vous et que vous n'avez pas besoin de vous déranger de la mémoire.

    La "fuite de la mémoire" Java que j'ai mentionnée plus tôt se produit si vous avez une grande structure que vous n'exige plus, mais en théorie l'application pourrait faire référence à des objets dans cette structure. Par exemple, vous avez une liste massive de chaînes, vous avez fini de les traiter mais n'a pas encore existé la méthode. C'est à ce moment-là que vous affectiez votre référence à NULL, de faire des objets tous dans la structure éligible à la collecte des ordures


0 commentaires