Ceci est une question théorique. Je ne suis que des curiosités que si Java dispose d'un mécanisme de collecte des ordures pour libérer la mémoire, alors pourquoi est-ce que j'ai cherché donc pour cela, mais pourrait obtenir ces liens p>
est le collecteur des ordures garanties Pour fonctionner avant de sortir d'une erreur de mémoire? p>
Collection ordures avant OutofMemoryError P>
Celles-ci ne répondent pas à ma question spécifiquement. Si Java permet une mémoire si bien en utilisant la collection de déchets, alors pourquoi OutofMemoryError code> se produit? p>
OutofMemoryError code> se produit? P>
7 Réponses :
Collecteur de déchets fonctionne sur la mémoire qui ne va pas être utilisé. p>
Toutefois, si vous allouez de la mémoire et que la mémoire est en portée, cela signifie que le collecteur des ordures ne peut pas vraiment nettoyer cette mémoire. P>
Lorsque la mémoire allouée est trop élevée au-dessus du VM autorisé, vous obtenez cette exception. P>
Un objet qui a toujours une référence à partir du code d'exécution ne peut être collecté. Donc, s'il y a un moyen d'accéder même théoriquement à un objet, il est coincé dans la mémoire. P>
Juste il est donc dit, Java ne Élimine em> la nécessité de se soucier de la mémoire; Il automatise tout simplement beaucoup de choses de gestion de la mémoire. Vous devez toujours faire votre part pour vous assurer que vous n'êtes pas escaturé des objets après leur vie utile ... Cause tant qu'ils peuvent être atteints (même indirectement), ils prennent la mémoire qui ne peut pas être récupérée. . P>
OHH OUI, comment se fait-il glisser de l'esprit que la création d'objets dans une boucle infinie peut créer plusieurs objets et avoir des références de la pile. Merci @chao, cela m'a aidé :)
Un OutOfMemoryError peut se produire si aucun des objets en mémoire n'est admissible à la collecte des ordures. Par exemple: Ceci crée une liste et conserve l'ajout d'objets code> myClass code> jusqu'à ce que la mémoire s'épuise. Aucun des objets n'est admissible à la collecte des ordures car il y a des références à toutes. P> p>
Il a complètement glissé de mon esprit qu'une boucle infinie peut provoquer la création d'objets infinis et toutes ont une référence de la pile. Merci monsieur :) Cela efface mon doute
@Prasadkharkar - Vous n'avez pas besoin d'une boucle infinie. C'est juste un exemple simple. Tout ce dont vous avez besoin est un problème où la quantité de données accessibles dans le calcul est trop grande pour le tas ... à un certain temps pendant le calcul.
@Stephenc, pour OutofMemoryError Code> Pour se produire, la boucle doit juste fonctionner assez longtemps pour reprendre tous les espaces de mémoire, non? Pas besoin de boucle infinie
@Prasadkharkar - Vous n'avez même pas besoin d'une boucle! Il suffit de tenter d'allouer un seul très grand tableau.
Oui, compris maintenant :) merci
Il est également possible de séquestrer la mémoire de manière à ne pas attendre. Considérez l'exemple de chaîne suivant.
// Java 1.7.0_06 and up char[] chars = new char[10_000_000]; // May need to adjust. String string = new String(chars); chars = null; String substring = string.substring(5_000_000); // Copies a portion of string's array to a new array. string = null; // string's array is no longer reachable, and may be garbage collected.
Ici, la «chaîne» sera disponible dans la mémoire mais elle ne sera pas référée, non? En effet, nous effectuons une opération sur l'objet String et, comme il est immuable, une nouvelle chaîne sera créée et la précédente sera perdue.
Non, puisque String code> est immuable, il n'y aura pas d'opérations pour modifier son contenu. Donc, il est sûr pour le JVM d'avoir
sous-chaîne code> réutiliser le
char [] code> intérieur
chaîne code>. Ensuite, lorsque
String code> est défini sur NULL, toutes les variables à l'intérieur
String code> peuvent être collectées, à l'exception du tableau lui-même;
Substring Code> se réfère à celui-ci.
merci beaucoup pour l'explication :)
Il est préférable de nuller vos objets une fois que votre travail est terminé avec eux, vous vous assurez donc que les objets doivent être disponibles sur le collecteur des ordures afin d'éviter les problèmes de la mémoire ou de la fuite de mémoire. P>
Ce n'est pas si facile. Et si plusieurs références font référence au même objet. Dans ce cas si vous annulez l'objet, il y a une chance de faire une référence en suspens !!! Donc, annuler l'objet n'est pas la solution toujours !!!
Réglage des références d'objet à NULL code> est généralement une perte de temps complète. Méthode - Les références locales sont hors de portée de toute façon et les références qui sont des variables d'instance ne sont-elles pas aussi faciles à définir sur NULL à des moments arbitraires, à moins qu'ils ne soient vraiment variables locaux, auquel cas ils tomberont hors de portée de toute façon ...
Si vous manquez de mémoire et il n'y a pas de variable ni d'objet éligible pour le retrait, l'exceptionnel sera soulevé. P>
Le meilleur moyen d'utiliser GC (collection de déchets) est: p>
Attribuez explicitement la variable à la valeur null si elle n'est plus utilisée. p>
Parce que toute la mémoire n'est pas une poubelle. P>
De mon compréhension, la mémoire des ordures est la mémoire occupée par des objets qui ne peuvent plus être référencés du programme. Ai-je raison?
C'est correct. Et si vous continuez à demander de plus en plus de mémoire que peut être référencée par le programme, vous allez sortir.
Oui, je l'ai eu :) merci monsieur
Si vous ne mettez pas votre rubish à l'extérieur, les collectionneurs ne pourront pas l'emporter. Même chose avec Java, si pour une raison quelconque, vous êtes en train de relâcher des références à vos objets, ils ne seront pas collectés par le collecteur des ordures. Ceci s'appelle une fuite de mémoire.
La collecte des ordures ne signifie pas que vous avez infini i> mémoire.
Cela permet-il donc l'acceptation d'une seule réponse? J'essaie d'accepter tous mais un seul est sélectionné
@Prasadkharkar, Yup seulement une réponse acceptée. S'ils sont tous aussi bons, j'accepte le premier à répondre et à upvote le reste.
Oui j'ai fait la même chose :)