Question

Je voulais juste savoir ce qui se passe derrière mon programme quand je déclare et initialiser une variable, puis l'initialiser à nouveau avec d'autres valeurs, par exemple un ArrayList ou quelque chose de similaire.

Qu'est-ce qui se passe dans ma RAM, quand je dis par exemple ceci:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al = new ArrayList<String>();

Alors, est mon premier ArrayList conservé en mémoire vive ou sera stockée la deuxième ArrayList sur la même position où le premier a été avant? Ou va changer juste la référence de « al »?

Si elle n'a pas été remplacée ... est-il un moyen de libérer manuellement la RAM qui a été occupée par le premier arraylist? (Sans attendre que le ramasse-miettes) Serait-il utile de le mettre d'abord = null?

salutations Nice, poeschlorn

Était-ce utile?

La solution

Le code que vous postez attribuera une nouvelle instance ArrayList. Si vous souhaitez réutiliser la même, vous pouvez faire ceci:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al.clear();
// now you can use a1

Mais faire avec prudence - si vous passez l'instance initiale de a1 à tout autre code qui utilisera pour une période plus longue, puis l'effacer causera des problèmes et vous aurez besoin d'une instance distincte.

Mais notez également que les économies que vous obtenez de recyclage des réseaux d'objets et ArrayLists ne sont pas exceptionnelles. Si vous stockez 10 x 4096 chaînes d'octets dans la liste de tableaux, la liste de tableau lui-même occupe seulement l'espace proportionnel à la taille des références, par exemple environ 4 octets x 10 = 40 octets. Ceci est une simplification, mais le principe est correct. Donc, même si vous réutilisez la même liste de tableau, vous ne vous enregistrez la mémoire utilisée pour stocker les références d'objet, et non les objets eux-mêmes. Avec cela à l'esprit, et les risques de provoquer des bugs en modifiant une collection sans le vouloir, je suppose que la plupart des gens ne se soucient pas de listes de recyclage.

La gestion de la mémoire dans une machine virtuelle moderne est vraiment très bon, et vous ne devriez commencer à introduire la mémoire « optimisations » quand vous voyez qu'il ya un besoin. En fait, l'utilisation d'objets plus longtemps que leur durée de vie naturelle peut avoir un effet négatif sur la performance de la collecte des ordures.

Mon conseil est, le code clairement d'abord, le profil, et se concentrer uniquement sur l'optimisation de l'utilisation de la mémoire lorsque vous voyez qu'il ya un problème et ont identifié la cause.

Bonne chance!

Autres conseils

Le nouveau ArrayList sera affecté de quelque autre partie de la mémoire, la référence est modifiée pour indiquer, et si l'ancien ArrayList n'est plus mentionné par autre chose, il sera nettoyé. Il n'y a aucun moyen de libérer de la mémoire manuellement en Java. Il se fait automatiquement.

variables Paramètres null est hors de propos, quand il est réglé sur quelque chose d'autre juste après ou il est une variable locale qui obtient de toute façon hors de portée bientôt (mais à l'intérieur des structures de données comme ArrayList, éléments de réglage du tableau contenu à null, lorsque l'élément est retiré, est nécessaire pour éviter les fuites de mémoire).

Un nouvel espace dans le tas sera alloué pour la nouvelle ArrayList.

Vous ne pouvez pas forcer la collecte des ordures et l'affectation nul ne servira qu'à manger des cycles de processeur. Vous pouvez appeler System.gc() suggérer la machine virtuelle Java exécuter le garbage collector, mais il n'y a aucune garantie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top